행이 발견되지 않은 경우 "0"을 포함하여 특정 패턴과 일치하는 행 수를 계산하는 가장 쉬운 방법은 무엇입니까?

행이 발견되지 않은 경우 "0"을 포함하여 특정 패턴과 일치하는 행 수를 계산하는 가장 쉬운 방법은 무엇입니까?

특정 줄을 포함할 수 있지만 반드시 그럴 필요는 없는 매우 큰 로그(하루에 몇 기가바이트)가 있습니다.매일 각 행의 발생 횟수를 계산해야 합니다.

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)}'

관련 정보