アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

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

awk パターン {アクション}
awk 'パターン {アクション}'
awk "パターン {アクション}"

A 回答 (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}'
と変数に代入して使うのがわかりやすいかも。
    • good
    • 0
この回答へのお礼

すみません。1週間も返事が遅れてしまいました。
とても丁寧に教えて頂いて分かりやすかったです。有難うございます。

"をつけたり'をつけたり、何もつけなかったりを色々試してみてみたいと思います。

お礼日時:2010/05/12 22:12

awkと言うよりシェルに対しての操作です。


「"」の場合はシェル変数や環境変数の展開を行いたい場合に使用します。
逆に「'」は囲まれた文字列をそのまま扱いたい場合に使用します。
awkの変数とシェル(環境)変数に同一のものが使用されていた場合、
「"」で使用するとシェル変数の中身がawkに渡ることになります。
したがってawkで使用する場合「'」を使用することが無難です。

以下補足です。
$ echo '$PWD'

$ echo "$PWD"
を試してみてください。結果の違いが分かると思います。
    • good
    • 0
この回答へのお礼

すみません。1週間もお返事が遅れてしまいました。

なるほど、シェルに対しての操作ですか・・・。
echo "$PWD"の"$PWD"が展開されて/home/hogehogeになって、echoに渡されて画面に表示されるという感じなのですね。

「awkの変数とシェル(環境)変数に同一のものが使用されていた場合」というのも注意が必要なのですね。
有難うございました。

お礼日時:2010/05/12 22:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!