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

8

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:)

    
por Wolfy 17.09.2012 / 08:43

6 respostas

4

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

    
por devav2 17.09.2012 / 11:33
4

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.

    
por January 17.09.2012 / 09:32
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
    
por kojiro 17.09.2012 / 13:46
1

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> .

    
por jeremija 17.09.2012 / 08:50
0

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.

    
por Ternary 03.01.2013 / 21:07
-1

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 ...:)

    
por Alessio Tomelleri 17.09.2012 / 10:01