때로는 일부 로그를 확인해야 하며이 명령 으로이 작업을 수행합니다.
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
있지만 어느 것을 보지 못합니다 … 🙂