• ベストアンサー

awkの「'」や「"」について

awkの「'」や「"」について 下記のような「'」をつけたり「"」をつけたり、逆に何もつけていないことがありますが、どのような使い分けを考えればよいのでしょうか? $0などを使う場合は「'」で囲むとかになるのでしょうか? 「'」自体を使わない場合は「'」で囲っておけばよい、とかいう考え方でよいのでしょうか? awk パターン {アクション} awk 'パターン {アクション}' awk "パターン {アクション}"

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

awk /a/{print} ⇒ a が含まれる行を出力 のようにシェルの特殊文字を含まない場合は、何も囲まなくて構いません。(正確には { } は文脈によっては特殊文字ですがこの場合は関係ない) awk /NR<10/{print} ⇒ 9行目までを出力 としたいと思っても、< はシェルのリダイレクトの特殊文字なので、10というディレクトリにある{print}というファイルから入力するという意味になってしまいます。 < をシェルに解釈させず、awk に渡すために、エスケープしないといけません。 awk /NR\<10/{print}、awk '/NR<10/{print}'、awk "/NR<10/{print}"、 awk /NR"<"10/{print} など、どれでも同じ意味になるいろいろなエスケープ方法があります。特殊文字一文字ずつに \ を前置するか、" " ' ' で囲むか。 他の例としては、awk /a/{print\ \$1} ⇒ a を含む行の第1フィールドを出力 この場合は、空白と $ をエスケープしてます。 awk の場合、シェルの特殊文字である、" や $ や 空白 を使用するので、全体を ' ' で囲むのが普通です。 例: awk '$1=="X"{print $2}' ⇒ 第1フィールドがXなら第2フィールドを出力 パターンやアクションで ' を使いたければ ' ' の中には書けないので、外にエスケープして書きます。 awk '/a/{print "'\''"}' ⇒ a を含んだ行に対して ' 一文字を出力 ちょっとわかりにくいので、こういうケースでは、 awk -v APOST=\' '/a/{print APOST}' と変数に代入して使うのがわかりやすいかも。

_alias_
質問者

お礼

すみません。1週間も返事が遅れてしまいました。 とても丁寧に教えて頂いて分かりやすかったです。有難うございます。 "をつけたり'をつけたり、何もつけなかったりを色々試してみてみたいと思います。

その他の回答 (1)

  • negi-bozu
  • ベストアンサー率25% (5/20)
回答No.1

awkと言うよりシェルに対しての操作です。 「"」の場合はシェル変数や環境変数の展開を行いたい場合に使用します。 逆に「'」は囲まれた文字列をそのまま扱いたい場合に使用します。 awkの変数とシェル(環境)変数に同一のものが使用されていた場合、 「"」で使用するとシェル変数の中身がawkに渡ることになります。 したがってawkで使用する場合「'」を使用することが無難です。 以下補足です。 $ echo '$PWD' と $ echo "$PWD" を試してみてください。結果の違いが分かると思います。

_alias_
質問者

お礼

すみません。1週間もお返事が遅れてしまいました。 なるほど、シェルに対しての操作ですか・・・。 echo "$PWD"の"$PWD"が展開されて/home/hogehogeになって、echoに渡されて画面に表示されるという感じなのですね。 「awkの変数とシェル(環境)変数に同一のものが使用されていた場合」というのも注意が必要なのですね。 有難うございました。

関連するQ&A

  • awkについて

    UNIXのawkコマンドにて、レコードを抜き出したいのですが、その時抜き出した各レコード毎に改行 をいれたいのですが、下記のような定義で問題ないでしょうか? awk -f PGMファイル 元データファイル > 抜き出したデータファイル PGMファイル は下記です。 BEGIN{ORS=\"\\n\"}  ←改行でいいんでしょうか? { if(substr($0, 5, 1) == \"1\"){ if(substr($0, 6, 2) == \"2\"){ print substr($0, 1,138) } } }

  • awkについて

    awkについて 今とあるファイルの/var/tmp/test 中の検索についてawkを使用しています。 123 abc 123-m 333 aaa-xx 1qwoko などタブキーで区切られています。 cat /var/tmp/test grep 123 | awk '$=="123"{print $2}' とやった場合存在するので 結果がでるのですが、その結果がない場合"NG"など文字列を出したいのですがどうすればいいでしょうか?

  • awkのBEGINについて

    awkのBIGIN内で、データファイルの途中のレコード情報を取得することは可能でしょうか? 以下が行いたい詳細です。 下記例のテキストファイルの”DATE”行をawkスクリプトファイルのBEGIN内で取得したい。 例:test.txt 11111 22222 33333 DATE=20040706 44444 よろしくお願いいたします。

  • awkについて

    度々すみません。awkについて先程教えて頂いたものですが、少し変更しようと思っているのですが上手くいきません。変更していることは、以下の○○○の内容を固定ではなくてコマンドラインから渡したいです。 ウェブで調べたところARGVというのを使うことはわかりました。そこで"○○○"からARGV[0]に変更してコマンド実行時に引数を与えたのですが、「○○○というファイルを開けません」というエラーになってしまいます。実行したのはawk -f awk data.csv ○○○です。なぜ引数をファイル名だと認識してしまうのでしょうか。初歩的で申し訳ありませんが教えて下さい。 BEGIN{ goukei = 0 count = 0 } { #フィールドの8番目の条件が一致する場合のみ9番目を合計 if($8=="○○○"){ goukei += $9 count++ } } END{ if(count!=0){ print "合計は", goukei print "平均は", goukei/count } else{ print "条件に一致するのない” } }

  • PowerShell で bash の awk 的な事

    PowerShellで下記のコマンドと同じような事がしたいです。 どのたかご教示ください。 awk '{print $1}' hoge.txt awk -v str="${hoge}" '{if($1==str) print $0}' hoge.txt awk '{print length($1)}' ヒントでも構いません、 よろしくお願い致します。

  • awkのセパレータ指定について

    awkのセパレータ指定について教えてください。 以下のようなファイルがありそれを'||'区切りで出力したいです。 下記のような指定をしてみたのですが、 うまくいきませんでした。 cat text | awk -F '||' '{print $1}' [test.txt] aaa||bbb||ccc [期待する結果] print $1 → aaa print $2 → bbb print $3 → ccc どなたか教えてください。 よろしくお願いします。

  • Bシェルのawkコマンドについて

    Bシェルのawkコマンドについてですが、例えばプロンプトから % ls -l hoge.txt | awk '{print $5}' と入力すると、hoge.txtのファイルサイズが出力されますが、同様のことをBシェルの中で行おうと思っています。 下記のように、配列arrayにはスペース区切りで3つのデータが入っており、N番目のデータを取得したいという場合に、Nに変数を使用して取得する方法がわかりません。 #!/bin/sh array="AA BB CC" num=3 # CCを取得したい echo $array | awk '{print $num}' 上記で実行すると、"AA BB CC"のようにすべて出力されてしまいます。awkで出力する箇所を${数値}で指定すればうまくいくのですが、ランダムで決めた数値(1~3)をnumに入れて取得したい場合、このようなことは可能でしょうか。 もし不可能な場合でも、awk以外に何かコマンドがあればご教授願います。なお、作成するのはBシェルになります。

  • 文字列の一部を取り除きたい(awk?)

    こんにちわ。 下記の文字列操作を行いたいのですが上手くいきません。 どなたか教えて下さい。 環境OSはsolarisです。 awkにはこだわりません。 ・最初の2文字を取り除く ・最後の文字が"2"の場合取り除く 例 yoroshikune → roshikune onegai2 → egai

  • [awk]マッチしたものをすべて取り出したい

    awk(GNU awk)を使って正規表現にマッチした部分文字列を最初にマッチしたものだけでなく、すべて取り出したいと思っています。 grepコマンドを使うと次のように簡単に取得できるのですが、awkだけで実現する場合どのように記述したらよいのでしょうか? ■例 $ echo 'abcdebx' | grep -o 'b.' 結果: bc bx # 最初にマッチしたものだけなら取得できる $ echo 'abcdebx' | awk 'match($0, /b./) {print substr($0, RSTART, RLENGTH)}' 結果: bc ■環境 GNU Awk 4.0.1 よろしくお願いします。

  • awkのsplitについて

    awkにつて質問いたします。 awkで項目を特定する時$1等指定しますが、最大で$199までしか対応していない事が分かりました。 そこでawk内部でsplitを使う事にしました。(この場合、200項目目以上可能) 項目の特定、変更は分かりましたが、レコード単位での出力("print 配列"等)の方法分かりません。 簡単に言いますと、 1.あるレコードのある項目を変更したい 2.変更後、レコード単位でファイルに出力したい ※項目は区切り文字で仕切られている ※項目は200以上ある です。 for文で回すのは最終手段にしたいと考えています。 ※この方法でしたら、実現しています。 ご存知の方、ご教授願えますか? 宜しくお願いいたします。