Alternatives pour 'egrep -o “succès | erreur | échec” <nomfichier> | trier | uniq -c '

8

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 d'entrée:

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 le faire avec une commande plus courte?

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

Wolfy
la source

Réponses:

4

Voici la awkfaçon de procéder

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

Mais toutes ces doublures seront un peu plus longues que notre bonne vieille grep

devav2
la source
4

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.

janvier
la source
J'ai ajouté un échantillon d'entrée à ma question ... J'espère que maintenant est plus clair ce que la commande fait ... sory pour le désagrément
Wolfy
1
OK, j'ai modifié le perl oneliner en conséquence. Je pense toujours que votre solution avec egrep est meilleure et plus intuitive.
Janvier
2

Pas beaucoup plus court, mais comme 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
kojiro
la source
1

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

#!/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.shet vous pouvez l'appeler comme myscript.sh <filename>.

jeremija
la source
Mais dans ce cas, la commande est la même ... vous venez de créer un script qui appelle la commande ...
Wolfy
Je pensais que vous vouliez simplement accélérer l'accueil de vos journaux. Juste curieux, pourquoi voulez-vous une commande alternative si celle que vous avez déjà fournie fait un bon travail pour vous?
jeremija
comme je l'ai dit: je suis juste curieux de voir comment les autres font quelque chose comme ça ... plusieurs fois, j'ai réalisé que les gens connaissent une façon élégante / agréable de faire les choses et j'aime apprendre maintenant des façons de faire les choses ...
Wolfy
2
Dans ce cas, vous êtes cette personne :-) Votre ligne de commande est agréable, concise, claire et exploite la puissance de la ligne de commande Unix. Que souhaiter d'autre?
Janvier
0

Votre commande, bien que courte et douce, est un moyen plutôt détourné 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 gros fichiers journaux (non sort). Je dirais que c'est un lavage.

Ternaire
la source
-1

Cela pourrait être une réponse factice mais je pense que, dans ce cas, sortest tout à fait inutile; vous pouvez peut-être l'omettre. Néanmoins, nous utilisons ici trois commandes différentes pour trois actions différentes.

Nous pouvons le raccourcir si certains d'entre eux peuvent être atteints avec une option grep, mais je ne vois pas laquelle ... :)

Alessio Tomelleri
la source
2
Non, ce n'est pas le cas, sinon uniq ne comptera que les instances consécutives de termes de recherche. Par exemple, si vous avez du succès, du succès, de l'échec, du succès, alors la sortie de uniq sera 2 success 1 fail 1 success.
Janvier
ça va ... sry
Alessio Tomelleri