ファイル内の連続エラーを見つけ、ファイル名をリストします。

ファイル内の連続エラーを見つけ、ファイル名をリストします。

私のログを分析するプロジェクトがあり、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で実行できます。awkif

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を使用してawknextfile次のファイルにスキップするために):

awk 'FNR == 1 || !/FATAL ERROR/ { count = 0 }
     /FATAL ERROR/              { ++count }
     count == 2 && do_print     { print FILENAME; nextfile }' ./*

シェルループに関する:

おすすめ記事