Linux에서 특정 형식을 grep하고 발생 횟수를 얻는 방법

Linux에서 특정 형식을 grep하고 발생 횟수를 얻는 방법

다음 줄이 포함된 로그 파일이 있습니다.

2022-05-21 23:59:59,2406,842,[75000000,074],passed
2022-05-21 23:59:59,2410,841,[750000,076],passed
2022-05-21 23:59:59,3002,892,[700000,78],passed

grep 하는 다른 방법이 있습니까 75? 70다음을 시도했지만 작동하지 않습니다. 나에게도 이런 이벤트가 필요하다.

cat 20220521log|grep -E "2022-05-21 23|75" -C

고쳐 쓰다:

위에서 언급한 것처럼 각 로그에는 서로 다른 타임스탬프와 숫자가 포함되어 있습니다. 내 패턴에 따라 각 파일에서 몇 개의 항목이 발견되는지 확인해야 합니다. 20220521 로그 파일을 예로 들어 보겠습니다. 숫자 필드로 시작하는 줄 수를 확인해야 합니다 75. 그 외 모든 필드는 이전과 동일합니다.

2022-05-21 23:59:59,2406,842,[75000000,074],passed //should take as one occurence
2022-05-21 23:59:59,2406,842,[00000000,074],passed //should not consider
2022-05-21 23:59:59,2406,842,[754324000,074],passed //should take as one occurence.

답변1

이를 위해 여러 프로그램을 호출할 필요가 없습니다. Perl(및 아마도 awk/python/...)이 모든 작업을 수행할 수 있습니다.

perl -a -F'' -e 'BEGIN { print "status  count\n" } $a = join "",(@F[30,31]); next unless ($a == 70 or $a == 75); $b{$a}++; END { for (keys %b) { print "$_      $b{$_}\n" } }' < 705361.log

( 705361질문의 ID입니다. 명령을 테스트하기 위해 파일/디렉터리를 만들기 전에 여기에 넣을 때 사용하는 규칙입니다.)

답변2

개수와 함께 모든 항목을 가져와야 하는 경우 간단히 다음을 수행할 수 있습니다.

grep '^2022-05-21.*\[75' logfilename | tee >(wc -l)

2022-05-21그러면 및 로 시작하는 [75모든 줄이 인쇄됩니다 . (각 줄에는 괄호로 시작하는 숫자 필드만 있다고 가정합니다.) 그런 다음 출력의 마지막 줄에 개수를 인쇄합니다(tee가 wc로 계산할 출력의 복사본을 보내도록 하여).

각 날짜에 고유한 파일이 있는 경우 이를 생략할 수 있습니다 ^2022-05-21.*. 행 개수가 아닌 개수만 필요하면 해당 파일을 삭제 하고 (소문자 c) | tee >(wc -l)만 사용하면 됩니다.grep -c

답변3

아마도 당신은 다음과 같은 것을 원할 것입니다:

<your-file grep -Po '^\d\d\d\d-\d\d-\d\d \d\d(?=:\d\d:\d\d,\d+,\d+,\[75)' |
  uniq -c

네 번째 필드가 매 시간마다 시작되는 행 수에 사용됩니다 [75(행이 시간순이라고 가정).

답변4

암호:

cat 20220521log | (echo "status count" ; awk -F "," '{list[substr($4,2,2)]++} END {for(i in list){print i, list[i]}}') | column -nt

결과:

결과

관련 정보