AWK を使用してログ ファイルから時間範囲を抽出する

AWK を使用してログ ファイルから時間範囲を抽出する

シェル変数を渡してログファイルから時間範囲を抽出しようとしていますawk。これが私のログファイルです。

2014-11-24 12:58:59.290 1.1.1.1  etc..
2014-11-24 13:58:59.290 2.2.2.2  etc..
2014-11-24 14:58:59.290 3.3.3.3  etc ..
2014-11-24 12:58:59.290 4.4.4.4  etc.. 
2014-11-24 15:58:59.290 4.4.4.4  etc..

12 時間から 13 時間までの時間範囲を抽出したいとします。以下は私が書いた bash スクリプトです。

stime=12
etime=13
date_=2014-11-24

awk 'BEGIN {
          a='$stime';b='$etime';d='$date_'; FS="[: ]"
       }

      { 
  if ( $1 == d && $2 >= a && $2 < b )
      print $1 $2 $3
      }'  logfile.txt

出力は次のようになります。

 2014-11-24 12:58:59.290 1.1.1.1  etc..  
 2014-11-24 12:58:59.290 4.4.4.4  etc..  

出力もエラーも見当たりません。何が問題なのかわかりません。これについて何か助けていただければ幸いです。ありがとうございます

答え1

stime=12
etime=13
date=2014-11-24

awk -v a="$stime" -v b="$etime" -v d="$date" -F "[: ]+" '
  { 
  if ( $1 == d && $2+0 >= a && $2+0 < b )
      print $1,$2,$3
  }'  logfile.txt

出力は次のようになります:

2014-11-24 12 58
2014-11-24 12 58

ノート:

  1. FS="[: ];"フィールド区切り文字がコロンまたはスペースとそれに続くセミコロンに設定されます。この組み合わせは入力ファイルでは発生しません。

  2. 元のコードでは、代入の 結果、 の値が取得されd='$date_';ました。これは、awk コードに導入されると、式が減算を必要とする数値式として解釈されるためです。d19792014-11-24

  3. オプションを使用してシェル変数を awk に転送することは良い習慣です-v。シェルと awk の両方で適切な引用符が必要になる場合があり、-vオプションを使用すると、これらの引用符の問題を 1 つずつ処理できます。

  4. awk は、コンテキストに応じて数値またはアルファベットの比較を行うことができます。+0コードを追加することで、awk が数値比較を実行していることが保証されます。

関連情報