web-dev-qa-db-fra.com

Alternatives pour 'egrep -o "success | error | fail" <nomfichier> | trier | uniq -c '

J'ai parfois besoin de vérifier certains journaux et je le fais avec cette commande:

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

Exemple de saisie:

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

Exemple de sortie:

1 error
1 fail
2 success

Je voudrais savoir si quelqu'un connaît un moyen de faire cela avec une commande plus courte?

Avant de vous demander pourquoi je voudrais faire cela avec une commande différente ... Aucune raison particulière, je suis simplement curieux :)

8
Wolfy

Voici la awk manière de le faire

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

Mais tous ces doublures seront un peu plus longues que notre bon vieux grep

4
devav2

Non, je pense que vous êtes aussi bon que possible. Naturellement, vous pouvez le faire avec un script Perl,

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

... mais c'est plus complexe et moins intuitif.

4
January

Pas beaucoup plus court, mais puisque vous n'avez pas vraiment besoin de l'expression régulière, il y a fgrep (grep -F).

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

une autre façon d'écrire la même chose en bash:

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

Vous pouvez écrire un script bash simple puis appeler le script, par exemple:

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

et enregistrez-le sous (par exemple) myscript.sh. Ensuite, faites un chmod +x myscript.sh et vous pourrez l’appeler comme myscript.sh <filename>.

1
jeremija

Votre commande, bien que courte et douce, est une façon plutôt détournée de compter les occurrences d’un terme. Je prendrais probablement l'approche directe et directe et utiliserais le drapeau -c de grep (qui fait exactement cela) à l'intérieur d'une boucle Shell:

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

Pas aussi court, pas aussi excitant, potentiellement plus rapide pour les fichiers journaux volumineux (no sort). Je dirais que c'est un lavage.

0
Ternary