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