일부 디버그 출력에 대한 사소한 통계를 얻으려고 합니다.
각 디버그 라인은 다음과 같은 형식입니다.(class name)(delimiter 1)(object ID)(delimiter 2)(method name)(delimiter 3)(log message)
어떤 방법에서 몇 줄이 나오는지 계산하고 싶습니다.
기본적으로 각 줄을 로 줄일 수 있는 경우 (class name)(delimiter)(method name)
각 줄임이 로그 파일에 나타나는 횟수를 알고 싶습니다.
계산을 수행하려면 Bash에서 어떤 명령을 실행할 수 있나요?
(저는 대부분의 기본 BSD 스타일 도구를 GNU 도구로 대체하는 macport를 사용하여 macOS에서 이 작업을 수행하고 있습니다.)
로 클래스 이름을 추출 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
질문에 답하기 위해 결승전이 필요하지 않습니다- 예, 문제를 해결하기 위해 정규식을 사용하면 이제 두 가지 문제가 발생합니다.