서로 다른 두 위치에서 일치하는 하위 문자열이 있는 줄 수를 계산하는 Bash 명령

서로 다른 두 위치에서 일치하는 하위 문자열이 있는 줄 수를 계산하는 Bash 명령

일부 디버그 출력에 대한 사소한 통계를 얻으려고 합니다.

각 디버그 라인은 다음과 같은 형식입니다.(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 -csort -u중복된 항목만 삭제 하므로 sort -u계산되지 않으므로 대체할 수 없습니다 .
  • sort질문에 답하기 위해 결승전이 필요하지 않습니다
  • 예, 문제를 해결하기 위해 정규식을 사용하면 이제 두 가지 문제가 발생합니다.

관련 정보