Alternativas para 'egrep -o “sucesso | erro | falha” <nome do arquivo> | classificar | uniq -c '


8

Às vezes, preciso verificar alguns logs e faço isso com este comando:

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

Entrada de amostra:

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

Saída de amostra:

1 error
1 fail
2 success

Gostaria de saber se alguém sabe como fazer isso com um comando mais curto?

Antes de você perguntar por que eu gostaria de fazer isso com um comando diferente ... Sem motivo especial, só estou curioso :)

Respostas:


4

Aqui está a awkmaneira de fazê-lo

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

Mas todos esses revestimentos serão um pouco mais longos do que nossos bons e velhos grep


4

Não, acho que você é o melhor possível. Naturalmente, você pode fazer isso com um script perl,

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

... mas é mais complexo e menos intuitivo.


Eu adicionei uma entrada de exemplo para a minha pergunta ... Espero que agora está mais claro o que o comando faz ... sory pelo inconveniente
Wolfy

1
OK, eu modifiquei o perl oneliner de acordo. Ainda acho que sua solução com o egrep é melhor e mais intuitiva.
janeiro

2

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

1

Você pode escrever um script simples do bash e depois chamá-lo, como:

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

e salve-o como (por exemplo) myscript.sh. Então faça um chmod +x myscript.she você pode chamar assim myscript.sh <filename>.


Mas neste caso, o comando é o mesmo ... você acabou de criar um script que chama o comando ...
Wolfy

Eu pensei que você só queria acelerar o grepping de seus logs. Apenas curioso, por que você deseja um comando alternativo se o que você já forneceu faz um bom trabalho para você?
Jeremija 17/09/12

como eu disse: só estou curioso para saber como outras pessoas fazem algo assim ... muitas vezes percebi que as pessoas sabem alguma maneira extravagante / agradável de fazer as coisas e eu amo aprender agora maneiras de fazer as coisas ...
Wolfy

2
Nesse caso, você é essa pessoa :-) Sua linha de comando é agradável, concisa, clara e explora o poder da linha de comando Unix. O que mais a desejar?
janeiro

0

Seu comando, embora curto e gentil, é uma maneira bastante tortuosa de contar ocorrências de um termo. Eu provavelmente adotaria a abordagem direta e direta e usaria a flag -c do grep (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 emocionante, potencialmente mais rápido para arquivos de log grandes (não sort). Eu diria que é uma lavagem.


-1

Esta poderia ser uma resposta fictícia, mas acho que, neste caso, sort é bastante inútil; talvez você possa omiti-lo. No entanto, aqui estamos usando três comandos diferentes para três ações diferentes.

Podemos encurtar se alguns deles forem alcançados com alguma opção de grep, mas não vejo qual ... :)


2
Não, não é, caso contrário, o uniq contará apenas instâncias consecutivas de termos de pesquisa. Por exemplo, se você tiver sucesso, sucesso, falha, sucesso, a saída da uniq será 2 success 1 fail 1 success.
janeiro

tudo bem ... sry
Alessio Tomelleri 17/09/12
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.