Aqui está a maneira awk
de fazer isso
awk 'BEGIN{RS=" "}/success/{s++}/fail/{f++}/error/{e++}END{print "Success:"s" Failed:"f" Error:"e}' abc
Mas todos esses forros serão um pouco mais longos do que o nosso bom e velho grep
Algum dia preciso verificar alguns logs e faço isso com este comando:
egrep -o "success|error|fail" <filename> | sort | uniq -c
Exemplo de entrada:
test error on line 10
test connect success
test insert success
test started at 00:00
test delete fail
Exemplo de saída:
1 error
1 fail
2 success
Gostaria de saber se alguém sabe como fazer isso com um comando mais curto?
Antes de perguntar por que eu gostaria de fazer isso com um comando diferente ... Nenhuma razão especial, estou apenas curioso:)
Aqui está a maneira awk
de fazer isso
awk 'BEGIN{RS=" "}/success/{s++}/fail/{f++}/error/{e++}END{print "Success:"s" Failed:"f" Error:"e}' abc
Mas todos esses forros serão um pouco mais longos do que o nosso bom e velho grep
Não, eu acho que você é tão bom quanto possível. Naturalmente, você poderia fazer isso com um script perl,
perl -nle 's/.*(error|fail|success).*// && $a{$_}++ ; END { print "$_ $a{$_}" for keys %a } ' test.txt
... mas é mais complexo e menos intuitivo.
Não muito mais curto, mas como você realmente não precisa da expressão regular, há fgrep
( grep -F
).
fgrep 'success
error
fail' "$filename" | sort | uniq -c
outra maneira de escrever a mesma coisa no bash:
fgrep $'success\nerror\nfail' "$filename" | sort | uniq -c
Você pode escrever um script simples e, em seguida, chamar o script, como:
#!/bin/bash
egrep -o "success|error|fail" "" | sort | uniq -c
e salve-o como (por exemplo) myscript.sh
. Em seguida, faça um chmod +x myscript.sh
e você pode chamá-lo como myscript.sh <filename>
.
Seu comando, embora curto e doce, é uma maneira indireta de contar as ocorrências de um termo. Eu provavelmente tomaria a abordagem direta e direta do grep -c flag (que faz exatamente isso) dentro de um loop de shell:
for i in success test fail; do echo 'grep -c $i <filename>' $i; done
Não tão curto, nem tão empolgante, potencialmente mais rápido para grandes arquivos de log (sem sort
). Eu diria que é uma lavagem.
Esta poderia ser uma resposta fictícia, mas acho que, neste caso, sort
é completamente inútil; talvez você possa omiti-lo. No entanto, aqui estamos usando três comandos diferentes para três ações diferentes.
Podemos abreviá-lo se algum deles for alcançado com alguma opção de grep
, mas não vejo qual ...:)
Tags command-line grep alternative