2016-09-30 7 views
0

私はアプリケーションログを持っており、すべての行を10000 msを超える実行時間で印刷する必要があります。以下のサンプルでは、​​2行目が10kmsを超えず、3行目に実行時間が表示されないため、最初の行のみが出力されます。awk行の条件に基づいた印刷行

SERVICE_NAME: | API: GetContents | 20160927000511741 | EXECUTION TIME: 10130(ms) 
SERVICE_NAME: | API: GetContentsExtend | 20160927000511741 | EXECUTION TIME: 22(ms) 
SERVICE_NAME: | API: GetContentsExtended | 20160927000511741 | Current TN: -15698724705531331 

私は、ファイルに複数のステップに

ストア実行値をすることによってこれを行うことができます:

cat input.txt | while read line 
do 
cat logfile.log | grep $line"(ms)" >> output.txt 
done 

ができるのと同じログを横断この入力ファイルを使用して

cat logfile.log | grep "EXECUTION TIME:" | awk '{print $NF}' | cut -d "(" -f1 | awk '{if ($1>9999) print $1}' >> input.txt 

ループこれはたぶん1ライナーコマンドで行うことができますか?私に苦労しているのは、実行時間値の後に(ms)あることです。

答えて

2

実行時間が> = 10000である場合、その文字列の前に、少なくとも5桁 "(MS)" が存在しますので、:

grep -E 'EXECUTION TIME: [[:digit:]]{5,}\(ms\)' filename 
+0

スレッシュホールドが1,000の代わりに1,234に変更された場合、正規表現とのマッチングは大きなアプローチではなく、数値比較になります。 –

1
$ awk '/EXECUTION TIME/ && ($NF+0)>=10000' file 
SERVICE_NAME: | API: GetContents | 20160927000511741 | EXECUTION TIME: 10130(ms) 

$NFは、行の最後のフィールドであります、例えば文字列10130(ms)。ゼロを追加すると結果が数値に変換されます。これはawkが最初の非数字(つまり()から終わりまでの文字列を取り除いて番号10130になることを意味します。それはちょうど>=10000の数値比較です。

+1

かなり正しい。 '($ NF + 0)'と '10130(ms) 'の仕組みを数字に換算して説明するといいかもしれません。 –

+0

十分に公正です。完了しました。 –

関連する問題