実行時間がXより長い行を見つける方法

実行時間がXより長い行を見つける方法

私のログにこの行があります。

InvokeSuperLambda 実行時間: xxs

ここで、xxは実行時間、sは静的文字です。

ログファイルでこのコマンドを実行すると

grep -a "invokeSuperLambda execution time" /root/.pm2/logs/proxy-out-1.log

わかりました。

2019-01-13 07:36:44.783,[email protected]:57888: << @@@@ Lambda     
:invokeSuperLambda execution time:0s
2019-01-13 07:37:02.909,[email protected]:58952: << @@@@ Lambda 
:invokeSuperLambda execution time:14s
2019-01-13 07:38:09.820,[email protected]:54992: << @@@@ Lambda 
:invokeSuperLambda execution time:1s
2019-01-13 07:38:11.866,[email protected]:59132: << @@@@ Lambda 
:invokeSuperLambda execution time:357s

実行時間が10秒を超える行のみをフィルタリングする方法が必要なため、上記の例では次の2行を取得する必要があります。

2019-01-13 07:37:02.909,[email protected]:58952: << @@@@ Lambda 
:invokeSuperLambda execution time:14s
2019-01-13 07:38:11.866,[email protected]:59132: << @@@@ Lambda 
:invokeSuperLambda execution time:357s

答え1

次のスクリプトを使用してこれを実行できます。

TIMEX=10
awk -F\: -v timex=$TIMEX '{if (int($NF) > timex) print}' /root/.pm2/logs/proxy-out-1.log

次のようにgrepスクリプトを追加します。

TIMEX=10
grep -a "invokeSuperLambda execution time" /root/.pm2/logs/proxy-out-1.log|awk -F\: -v timex=$TIMEX '{if (int($NF) > timex) print}'

答え2

OPが提案したように、この行が「Lambda」の後に続くと仮定すると、次のコマンドが機能します。

gawk 'match($0, /execution\stime:([0-9]+)s/, a) && a[1] > 10 { print $0 }' logfile

「logfile」はログファイルの名前です(/root/.pm2/logs/proxy-out-1.log)。

ソリューションはmatch関数を使用して実行時間を角かっこグループとしてキャプチャし、キャプチャされた値に基づいて数値比較を実行してその行を印刷する必要があるかどうかを決定します。

より長いが、より移植可能なバージョンは次のとおりです。

awk 'match($0, /execution time:([0-9]+)s/) && substr($0, RSTART+15, RLENGTH-16 ) > 10 { print }' testfile

答え3

コメントによると

grep -a -E "invokeSuperLambda execution time:[0-9]{2,}s" /root/.pm2/logs/proxy-out-1.log

どこ

  • -E拡張正規表現を表します。
  • [0-9]{2,}2文字以上の文字0対文字9

関連情報