2016-11-10 8 views
0

私は、ログファイルに2つの異なる時間の間に特定の文字列が含まれているかどうかを調べています。タイム・スタンプ2016-11-10 06:45:002016-11-10 10:45:00で始まる行の間にfooが存在する場合、threshold変数は時間を設定します。たとえば、240は4時間です。AwkとGrepを使用して、ログファイル内の2つの時間の間の線を見つける

current="$(date "+%Y-%m-%d %H:%M:%S")" 
threshold=240 
dt_format="+%Y-%m-%d %H:%M:%S" 
from="$(date -d "$threshold minutes ago" "$dt_format")" 

if awk '$0 >= "$from" && $0 <= "$current"' /path/file.log | grep "foo" 
then 
    exit 0 
else 
    exit 1 
fi 

しかし、私はわからないんだけど、なぜ私はif文でコマンドラインで$from$currentを渡すとき、それは実際にそれを読んでいません。それはすなわち2016-11-10 06:45:00from2016-11-10 10:45:00のように、右の日付を比較していないと、すべての行と終了0

を返します。しかし、私は手動でif文の日付を入れている場合ので、私はゴミに渡しているかのようですcurrentそれから、2つの日付の間にある正しい行が返され、grepを使ってその行にfooが含まれているかどうかを確認できます。

threshold変数を変更して、自分のニーズに基づいて2つの異なる時間をチェックする必要があるため、自分のコードが機能しない理由を実際に理解できません。

2016-11-10 06:45:00は、タイムラインが各行の先頭からどのようにフォーマットされているかをログに記録します。

ありがとうございました。

+0

これは役に立つかもしれません:[Schwartzian transform](https://en.wikipedia.org/wiki/Schwartzian_transform) – Cyrus

+0

あなたは 'if ...; 0を終了します。そうでなければ出口1。あなたがそれを残しておけば、あなたのスクリプトはgrepの終了ステータスで終了します。 –

答えて

3

bash拡張変数を一重引用符で囲みます... s="string"; echo '$s'を実行すると、意味がわかります。

だからこそ'$0 >= "$from" && $0 <= "$current"'というのは文字どおりの文字です。おそらくあなたが望むものではありません。

"それはawkの議論です..."そう、awkは$ 0と$ 1の処理方法を知っているので、awkはそれらを適切に拡張しています。しかし、あなたはawkが'$0 >= "some_time" && $0 <= "Some_other_time"'を得ることを期待していたが、それはしなかった!

だから、あなたはAWKに変数を渡す方法はsome_variable="world"; awk -v my_variable=$some_variable 'BEGIN{print "hello", my_variable}'

をやっているので、あなたはif awk -v f="$from" -v c="$current" '$0 >= f && $0 <= c' /path/file.log | grep "foo"

http://www.catonmat.net/blog/ten-awk-tips-tricks-and-pitfalls/にこの記事をチェックアウトする必要があります実際にあなたがawkので行うことができますきちんとしたものにいくつかの良い洞察力を持っています。 "split file on patterns"をここでは使用するコマンドの量を減らすために使うことができますが、awkについて何かを学ぶこともできます。

+1

変数 "to"と "from"には空白が含まれているので、クォートが重要です: 'awk -v from =" $ from "-v c =" $ current "... –

+0

@glenn –

関連する問題