grep plusieurs fichiers obtiennent le nombre de coupes uniques

Je pense que je suis proche de cela, et j’ai vu des questions similaires, mais je ne pouvais pas le faire fonctionner comme je le souhaitais. J’ai donc plusieurs fichiers journaux et je voudrais compter les occurrences de plusieurs appels de service différents par date.

D’abord j’ai essayé le ci-dessous, la coupe est juste pour obtenir le premier élément (date) et le 11ème élément (nom de l’appel de service), qui est spécifique à mon fichier journal:

grep -E "invoking webservice" *.log* | cut -d ' ' -f1 -f11 | sort | uniq -c 

Mais ceci a retourné quelque chose qui ressemble à:

 5 log_1.log:2017-12-05 getLegs() 10 log_1.log:2017-12-05 getArms() 7 log_2.log:2017-12-05 getLegs() 13 log_2.log:2017-12-04 getLegs() 

Ce que je veux vraiment c’est:

 12 2017-12-05 getLegs() 10 2017-12-05 getArms() 13 2017-12-04 getLegs() 

J’ai vu des exemples où ils se cat * d’abord, mais ressemble au même problème.

 cat * | grep -E "invoking webservice" *.log* | cut -d ' ' -f1 -f11 | sort | uniq -c 

Qu’est-ce que je fais mal? Comme toujours, merci beaucoup!

Votre problème semble être que grep préfixe les lignes correspondantes avec les noms de fichiers. ( grep a ce comportement lorsque plusieurs noms de fichiers sont spécifiés, pour désambiguïser les résultats.) Vous pouvez passer le -h à grep pour ne pas imprimer les noms de fichiers:

 grep -h "invoking webservice" *.log | cut -d ' ' -f1 -f11 | sort | uniq -c 

Notez que j’ai supprimé l’indicateur -E , car il est utilisé pour activer le support regex étendu, et votre exemple n’en a pas besoin.

Vous pouvez également utiliser cat pour vider le contenu des fichiers vers une sortie standard et le transférer vers grep . Cela fonctionnerait, car cela supprime le besoin de parameters de nom de fichier pour grep :

 cat *.log | grep "invoking webservice" | cut -d ' ' -f1 -f11 | sort | uniq -c