발생한 예외가 포함된 로그 파일이 있다고 가정해 보겠습니다.
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더 알아보기.