‘egrep -o“success | error | fail”<filename>에 대한 대안 | 정렬 | 유니크 -c ‘ 하며이 명령 으로이 작업을

때로는 일부 로그를 확인해야 하며이 명령 으로이 작업을 수행합니다.

egrep -o "success|error|fail" <filename> | sort | uniq -c

샘플 입력 :

test error on line 10
test connect success
test insert success
test started at 00:00
test delete  fail

샘플 출력 :

1 error
1 fail
2 success

짧은 명령 으로이 작업을 수행하는 방법을 알고 있는지 알고 싶습니다.

왜 다른 명령 으로이 작업을 수행하고 싶은지 묻기 전에 특별한 이유는 없습니다.



답변

여기 awk방법이 있습니다

awk 'BEGIN{RS=" "}/success/{s++}/fail/{f++}/error/{e++}END{print "Success:"s" Failed:"f" Error:"e}' abc

그러나이 모든 라이너는 우리의 오래된 것보다 조금 길어질 것입니다. grep


답변

아니, 나는 당신이 얻는만큼 좋은 것 같아요. 당연히 하나의 펄 스크립트로 할 수 있습니다.

perl -nle  's/.*(error|fail|success).*/$1/ && $a{$_}++ ; END {  print "$_ $a{$_}" for keys %a } ' test.txt

…하지만 더 복잡하고 덜 직관적입니다.


답변

훨씬 짧지는 않지만 실제로 정규 표현식이 필요하지 않기 때문에 fgrep( grep -F)가 있습니다.

fgrep 'success
error
fail' "$filename" | sort | uniq -c

bash에서 같은 것을 쓰는 또 다른 방법 :

fgrep $'success\nerror\nfail' "$filename" | sort | uniq -c

답변

간단한 bash 스크립트를 작성한 후 다음과 같이 스크립트를 호출 할 수 있습니다.

#!/bin/bash
egrep -o "success|error|fail" "$1" | sort | uniq -c

(예를 들어)로 저장하십시오 myscript.sh. 그런 다음 a를 수행하면 다음 chmod +x myscript.sh과 같이 호출 할 수 있습니다 myscript.sh <filename>.


답변

짧고 달콤하지만 명령은 용어의 발생을 계산하는 다소 회로적인 방법입니다. 아마도 무딘 직접적인 접근 방식을 취하고 쉘 루프 내부에서 grep의 -c 플래그를 사용합니다.

for i in success test fail; do echo `grep -c $i <filename>` $i; done

큰 로그 파일의 경우 짧지 않고 흥미롭지 않고 잠재적으로 더 빠릅니다 (아니오 sort). 나는 그것이 세탁이라고 말하고 싶었다.


답변

이것은 답이 될 수 있지만이 경우 sort에는 매우 쓸모가 없다고 생각합니다. 어쩌면 당신은 그것을 생략 할 수 있습니다. 그럼에도 불구하고 우리는 세 가지 다른 행동을 위해 세 가지 다른 명령을 사용하고 있습니다.

옵션 중 일부에 도달하면 단락 할 수는 grep있지만 어느 것을 보지 못합니다 … 🙂