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

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

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

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

관련 정보