アドバイスをすることができる(希望的に)興味深い質問があります。ログの保存に主に使用されるシステムがあります。ディレクトリ構造は次のとおりです。
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 -l
grep
そのファイルをサポートしていない場合は、そのファイルをzcat
。gzip -dc
zcat
.gz
zsh
GNUを使用すると、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