![Linux에서 특정 형식을 grep하고 발생 횟수를 얻는 방법](https://linux55.com/image/206830/Linux%EC%97%90%EC%84%9C%20%ED%8A%B9%EC%A0%95%20%ED%98%95%EC%8B%9D%EC%9D%84%20grep%ED%95%98%EA%B3%A0%20%EB%B0%9C%EC%83%9D%20%ED%9A%9F%EC%88%98%EB%A5%BC%20%EC%96%BB%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
다음 줄이 포함된 로그 파일이 있습니다.
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
(행이 시간순이라고 가정).