アクセスログから特定のレスポンスステータスを抜き出す簡易的なスクリプトを作っていたのですが、awk の中でシェル変数を使う機会があったので備忘録として残しておきます。
今まで使う機会なかったのですが少しハマりました。
シンタックスエラー
awk 内でステータスコードの値を持ったシェル変数をそのまま定義すると、下記の通り解釈できずに syntax error が出ます。
1 2 3 4 | awk: ($8 == ${s}){print $0} awk: ^ syntax error awk: ($8 == ${s}){print $0} awk: ^ syntax error |
シングルクォートの使い方がポイント
結果としては、awk はシングルクォートに囲まれたところを解析しようとするので、シェル変数の部分はシングルクォートから外してあげればシェル変数として扱ってくれるということです。
よって、下記のように awk コマンド内の ${hs} のシェル変数をシングルクォートで囲んであげます。
1 2 3 4 5 6 7 | #!/bin/sh HTTP_STATUS="403 404 500" for hs in ${HTTP_STATUS}; do echo "HTTP_STATUS: ${hs}" awk '($9 == '${hs}'){print $0}' /var/log/nginx/access.log done |
文字列を比較するなら、下記のようにしてもいいのかも。
1 | awk '($1 == "'"${hoge}"'"){print $0}' /var/log/nginx/access.log |