각 발생 후 고유 패턴 발생 횟수를 인쇄합니다.

각 발생 후 고유 패턴 발생 횟수를 인쇄합니다.

발생한 예외가 포함된 로그 파일이 있다고 가정해 보겠습니다.

ExceptionA
loggedFunctionCall
ExceptionB
ExceptionA
loggedFunctionCall
ExceptionD
ExceptionB
loggedFunctionCall
ExceptionB

각각의 다른 예외 발생 횟수를 계산하고 싶습니다. 현재 내 솔루션은 다음과 같습니다.

cat file.txt | grep Exception | sort | uniq -c | sort -n

결과:

      1 ExceptionD
      2 ExceptionA
      3 ExceptionB

그러나 오른쪽에 개수를 표시하고 이러한 들여쓰기를 제거하고 싶으므로 최종 효과는 다음과 같아야 합니다.

ExceptionD 1
ExceptionA 2
ExceptionB 3

저는 추가 bash 스크립트를 작성하지 않고 순수 터미널 명령만 사용하는 간단한 솔루션을 찾고 있습니다.

답변1

간단한 awk 명령을 사용하여 전체 작업을 수행할 수 있습니다.

awk '/Exception/{a[$0]++} END {for (x in a) print x,a[x]}' file | sort -nk2

산출

ExceptionD 1
ExceptionA 2
ExceptionB 3

연관 배열의 순서는 awk정의되어 있지 않으므로 일반적으로 로 파이프해야 합니다 sort. k2이는 두 번째 필드를 기준으로 정렬하는 것을 의미합니다.


정렬하는 또 다른 방법은 GNU를 사용하는 것입니다.awk 예정된 정렬그리고 숫자 오름차순으로 정렬합니다.

awk '/Exception/{a[$0]++} END {
        PROCINFO["sorted_in"] = "@val_num_asc"
        for (x in a) print x,a[x]
    }' file

또는 기존 명령을 유지하고 두 필드의 위치를 ​​바꾸려면 다음과 같이 수정할 수 있습니다.

grep 'Exception' file | sort | uniq -c | awk '{print $2,$1}' | sort -nk2

답변2

그리고perl

perl -lne '$h{$_}++ if /Exception/;
           END{print "$_ $h{$_}" for sort {$h{$a} <=> $h{$b}} keys %h}'

sort {$h{$a} <=> $h{$b}} keys %h해시값을 기준으로 정렬됩니다. 바라보다https://perldoc.perl.org/functions/keys더 알아보기.

관련 정보