여러 필터를 사용하여 하나씩 인쇄하는 방법은 무엇입니까?

여러 필터를 사용하여 하나씩 인쇄하는 방법은 무엇입니까?

로그의 일부 패턴을 계산해야 합니다.

grep aaa ./logs | wc -l

grep bbb ./logs | wc -l

한 줄로 모든 작업을 수행하는 쉬운 방법이 있습니까? 좋다

cat ./logs | grep -c aaa | grep -c bbb #didn't work.

답변1

다음 명령을 사용할 수 있습니다.

$ grep -oh -e aaa -e bbb ./logs | sort | uniq -c

에서 다음을 man grep읽을 수 있습니다.

-o, --only-matching 일치하는 줄 중 일치하는(비어 있지 않은) 부분만 인쇄합니다. 각 부분은 별도의 출력 줄에 표시됩니다.

또한 다음의 경우 -h:

-h, --no-filename 출력에서 ​​파일 이름 접두어를 억제합니다. 검색할 파일이 하나만(또는 표준 입력만) 있는 경우 이것이 기본값입니다.

둘 중 하나를 일치시키는 데 사용됩니다 -e. 그런 다음 결과를 정렬하고 계산하는 데 사용합니다 uniq.

답변2

이 플래그를 사용할 수 있습니다 -e PATTERN. 얼마나 많은 행이 포함되어 있는지 계산하려면둘 중 하나 또는 둘 다 aaa또는 bbb:

grep -e aaa -e bbb ./logs | wc -l

aaa합계를 별도로 계산하려면 bbbKhaled의 솔루션을 확인하세요.

답변3

사용 awk:

awk '/aaa/ { count["aaa"]++ }
     /bbb/ { count["bbb"]++ }
     END { for (pat in count) print count[pat], pat }'  file

패턴이 일치할 때마다 일치하는 패턴과 관련된 개수가 업데이트됩니다. 마지막으로 개수 목록과 해당 패턴이 출력됩니다.

답변4

다음 명령을 사용해 보았습니다.

웨인:~$for i in aaa bbb; do perl -pne "s/\n/ /g" i.txt| awk -v i="$i" '{print gsub(i,$0)}';echo $i; done| sed "N;s/\n/ /g"| awk '{print $2,$1}'

산출

웨인:~$for i in aaa bbb; do perl -pne "s/\n/ /g" i.txt| awk -v i="$i" '{print gsub(i,$0)}';echo $i; done| sed "N;s/\n/ /g"| awk '{print $2,$1}'

aaa 1
bbb 2

관련 정보