.logファイルにシェル変数を渡してログファイルから時間範囲を抽出しようとしています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
メモ:
FS="[: ];"
フィールド区切り文字がコロンまたはスペースに設定され、その後にセミコロンが続きます。この組み合わせは入力ファイルには表示されません。元のコードでは、割り当て
d='$date_';
結果のd
値が1979
。これは、awkコードに導入されると、その式が2014-11-24
減算が必要な数値式として解釈されるためです。オプションを使用してシェル変数をawkに転送するのは良い習慣です
-v
。シェルとawkの両方に正しい引用が必要です。この-v
オプションを使用すると、これらの引用の問題を一度に処理できます。awkは状況に応じて数字または文字の比較を実行できます。コードを追加して、
+0
awkが数値比較を実行していることを確認します。