私のログにこの行があります。
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