일부 디버그 출력에 대한 사소한 통계를 얻으려고 합니다.
각 디버그 라인은 다음과 같은 형식입니다.(class name)(delimiter 1)(object ID)(delimiter 2)(method name)(delimiter 3)(log message)
어떤 방법에서 몇 개의 행이 나오는지 계산하고 싶습니다.
기본적으로 각 행을 로 줄일 수 있는 경우 (class name)(delimiter)(method name)
로그 파일에서 각 축소가 몇 번 발생하는지 알고 싶습니다.
계산을 수행하려면 Bash에서 어떤 명령을 실행할 수 있나요?
(저는 macOS에서 macports를 사용하여 대부분의 기본 BSD 스타일 도구를 GNU 도구로 대체합니다.)
클래스 이름 추출을 사용 grep -o -E "^.*(delimiter 1)
하거나 메소드 이름 추출을 사용 grep -o -E "(delimiter 2).*(delimiter 3)"
하거나 둘 다 강조 표시할 수 있습니다 grep --color=always -E "^.*(delimiter 1)|(delimiter 2).*(delimiter 3)"
. grep
나는 계산할 수 있는 두 개의 일치 항목만 출력 하는 방법을 찾고 있었습니다 | uniq -c
.
grep
하나의 일치 항목이나 전체 줄 대신 한 줄에 두 개의 일치 항목을 인쇄하는 방법이 있습니까 ?
답변1
기본적으로 다음과 같이 작동합니다.
sed -r -n 's/(^.*)(delimiter 1)(.*)(delimiter 2)(.*)(delimiter 3)(.+$)/\1(delimiter)\5/p' <( command that generates debug logs ) | sort | uniq -c | sort -rn
(에서 적응여기)
.*
너무 많이 일치할 수 있습니다.sed
가능한 한 빨리 일치시키려고 하므로 구분 기호를 부정해야 할 수 있습니다(불편한 구분 기호가 있으면 복잡해질 수 있음).- From to가 중요
^
합니다$
. 표현식이 일치하지 않으면 전체 줄에sed
일치하지 않는 부분이 출력에 포함 됩니다. - 괄호는 클래스 및 메서드 이름 주위에만 필요합니다. 다른 이름을 제거하면 끝에 있는 숫자가 변경됩니다. 이러한 숫자는 괄호 안의 하위 표현식을 순차적으로 참조하기 때문입니다. (모두 포함하면 출력에서 무슨 일이 일어나고 있는지 더 많이 보여줄 수 있습니다
sed
. 예를 들어 끝 부분을 로 변경하면 됩니다/\1(delimiter)\5 -- \1\2\3\4\5\6\7/p
.) sort
연속된 동일한 행이 있는 실행만 계산되고, 연속되지 않은 동일한 행은 별도로 계산되므로 먼저 실행해야 합니다uniq -c
.uniq -c
uniq -c
sort -u
중복된 항목만 제거 되므로 대체할 수 없으며sort -u
, 계산되지 않습니다.- 마지막에
sort
질문에 답할 필요는 없습니다. - 예, 정규식을 사용하여 하나의 문제를 해결하면 이제 두 가지 문제가 발생합니다.