로그의 일부 패턴을 계산해야 합니다.
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
합계를 별도로 계산하려면 bbb
Khaled의 솔루션을 확인하세요.
답변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