私のログを分析するプロジェクトがあり、3回以上発生する連続エラーを見つけてログ名を一覧表示する必要があります。私のログが大きいので、次のスクリプトを書いています。
for i in `ls`
do
count=`uniq -c $i | grep 'FATAL ERROR' |sed 's/^ *//g'| sed 's/ /,/g' | awk -F',' '{if($1 >1) {print $1}}'`
if [[ $count -ge 2 ]]
then
echo $i
fi
done
これは、すべてのファイルの発生回数だけを知る必要がある場合に機能します。
grep -o -c Source * | awk -F: '{if ($2 > 2){print $1}}'
私のスクリプトのより良いバージョンは何ですか?ログが大きすぎてコードが遅くなるとどうなりますか?
ベストアンサー1
パイプは通常短くする必要があり、値を取得するために実行するほとんどの操作はループやステートメントを含む単一のプログラムcount
で実行できます。awk
if
awk 'FNR == 1 || !/FATAL ERROR/ { count = 0 }
/FATAL ERROR/ { ++count }
count == 2 { print FILENAME }' ./*
awk
これにより、現在ディレクトリに隠されていないすべてのファイルに対して単一のプログラムが実行されます。
count
新しいファイルの最初の行にある場合、プログラムはその変数をゼロにリセットします。または現在の行がパターンと一致しない場合FATAL ERROR
。
行がパターンと一致すると、FATAL ERROR
変数count
が増加します。
count
変数の値が2に達すると、現在のファイルの名前が印刷されます。
コードは、パターンに一致する2つの連続する行が見つかるたびにファイル名を印刷します。これは、同じファイルで複数回発生しても同じです。必要でない場合は、コードを少し拡張できます。
awk 'FNR == 1 { count = 0; do_print = 1 }
!/FATAL ERROR/ { count = 0 }
/FATAL ERROR/ { ++count }
count == 2 && do_print { print FILENAME; do_print = 0 }' ./*
またはGNUを使用してawk
(nextfile
次のファイルにスキップするために):
awk 'FNR == 1 || !/FATAL ERROR/ { count = 0 }
/FATAL ERROR/ { ++count }
count == 2 && do_print { print FILENAME; nextfile }' ./*
シェルループに関する: