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

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


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.


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

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


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.


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.