특정 줄을 포함할 수 있지만 반드시 그럴 필요는 없는 매우 큰 로그(하루에 몇 기가바이트)가 있습니다.매일 각 행의 발생 횟수를 계산해야 합니다.
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
그래서질문예: 파일의 한 줄이 pattern.in
일치하지 않는 경우 "0"을 어떻게 인쇄합니까? 내가 가진 전부이기 때문에 가장 간단한 방법으로 수행해야 합니다.시그윈환경.
답변1
각 패턴에 대해 하나 이상의 일치 항목이 발견되도록 패턴 파일을 데이터 파일로 반환한 다음 각 일치 항목에 대해 보고된 최종 개수에서 1을 빼려면 어떻게 해야 합니까?
grep -f patterns.in logfile.txt patterns.in | cut -f2 -d':' | sort | uniq -c | awk '{print($1 - 1" "$2)}'