複数のディレクトリにあるすべての文字列の総数を取得しますか?

複数のディレクトリにあるすべての文字列の総数を取得しますか?

アドバイスをすることができる(希望的に)興味深い質問があります。ログの保存に主に使用されるシステムがあります。ディレクトリ構造は次のとおりです。

YYYY/MM/DD/hostname/

多くのホスト名があり、各ホスト名の下には圧縮された時間ごとのログ(アクセス、エラーなど)がたくさんあります。

私が興味を持っているのは、アクセスログにある特定の文字列の総数です(日付とホスト名で分類)。最良のアプローチは何ですか? findとgrepを組み合わせてこれを達成できますか?それとも複雑すぎてスクリプトが必要ですか?

答え1

for d in */*/*/*; do
  printf '%s: ' "$d"
  zcat -- "$d/"*.gz | grep -Fc STRING
done

STRINGを含む行数が計算されます。

発生回数を取得するには(GNU仮定)grep -Fc STRINGに置き換えてください。grep -Fo STRING | wc -lgrep

そのファイルをサポートしていない場合は、そのファイルをzcatgzip -dczcat.gz

zshGNUを使用すると、grep次のように短縮できます。

for d (*/*/*/*) zcat $d/*.gz | grep -FcH --label=$d STRING

答え2

標準ログアナライザなしでこれを行うには、YYYYディレクトリを含むディレクトリのシェルで「1行」でこれを実行できます。

for d in */*/*; do 
  echo -n "$d : "
  find $d -name *.log | xargs grep -c STRING
done

関連情報