特定の行を含めることはできますが、必ずしもそうである必要はない非常に大きなログ(1日に数ギガバイト)があります。毎日各行の発生回数を計算する必要があります。
patterns.in
必要な行を含むファイルがあります。たとえば、
aaaa
bbbb
cccc
dddd
eeee
ffff
ログファイルは次のとおりです。
asd
dfg
aaaa
aaaa
sa
sdf
dddd
dddd
dddd
dddd
ghj
bbbb
cccc
cccc
cccc
fgg
fgh
hjk
最初の(おそらく最も明確な)方法は、を使用してgrep
次のようにsort
実行することです。uniq
grep -f patterns.in logfile.txt | sort | uniq -c
次の結果を提供します。
2 aaaa
1 bbbb
3 cccc
4 dddd
私が達成しようとしている目標に近いが、望む結果は次のとおりです。
2 aaaa
1 bbbb
3 cccc
4 dddd
0 eeee
0 ffff
だから質問例:ファイルの1行がpattern.in
一致しない場合は、「0」をどのように印刷しますか?私が持っているすべてなので、最も簡単な方法で行う必要があります。シグウィン環境。
答え1
パターンごとに1つ以上の一致が見つかるようにパターンファイルをデータファイルに返し、各一致について報告された最終数から1を減算するにはどうすればよいですか?
grep -f patterns.in logfile.txt patterns.in | cut -f2 -d':' | sort | uniq -c | awk '{print($1 - 1" "$2)}'