1
votes

Pourquoi ces deux commandes GREP donnent-elles des résultats différents?

J'ai un gros fichier journal contenant des lignes pour une tâche particulière comme suit:

grep 'My Task :' | uniq | wc -l
grep -E 'My Task :' | sort --unique | grep -cE 'My Task :'

Je veux compter le nombre de "Ma tâche" uniques enregistrés . Ce qui dans ce cas devrait être 3.

J'ai utilisé ces deux commandes qui, à mon avis, devraient donner les mêmes résultats corrects:

[info] My task : 123
[info] Other task : 111
[info] My task : 456
[info] My task : 456
[info] My task : 789

Les deux commandes donnent les mêmes résultats sur les petits fichiers de test que je crée mais des résultats différents sur le gros fichier journal sur le serveur. Je ne comprends pas pourquoi. Pour être exact, la première commande donne un compte de ~ 33k tandis que la seconde donne ~ 15k. Quelle commande des deux, le cas échéant, est correcte? Et que dois-je faire idéalement?


1 commentaires

Il n'y aura aucune correspondance si vous utilisez Ma tâche car grep est sensible à la casse par défaut.


3 Réponses :


2
votes

Il est possible que cela arrive car uniq ne peut trouver que consécutifs lignes identiques. Dites, si votre fichier ressemble à ceci:

$ grep 'My task :' FILE | uniq | wc -l
15
$ grep -E 'My task :' FILE | sort --unique  | wc -l
3

les résultats seront différents:

[info] My task : 123
[info] Other task : 111
[info] My task : 456
[info] My task : 456
[info] My task : 789

[info] My task : 123
[info] Other task : 111
[info] My task : 456
[info] My task : 456
[info] My task : 789

[info] My task : 123
[info] Other task : 111
[info] My task : 456
[info] My task : 456
[info] My task : 789

[info] My task : 123
[info] Other task : 111
[info] My task : 456
[info] My task : 456
[info] My task : 789

[info] My task : 123
[info] Other task : 111
[info] My task : 456
[info] My task : 456
[info] My task : 789


0 commentaires

0
votes

Problème: uniq et sort -u

Ils devraient être équivalents dans le cas simple, mais se comporteront différemment si vous utilisez l'option -k pour définir uniquement certains champs de la ligne d'entrée à utiliser comme clés de tri. Dans ce cas, trier -u supprimera les lignes qui ont la même clé même si d'autres parties du ligne diffèrent, alors que uniq supprimera uniquement les lignes qui identique .

** Différence entre les deux commandes **

1ère commande grep 'Ma tâche:' | uniq | wc -l : Il imprime le décompte de lignes uniques pour "Ma tâche"

2e commande grep -E 'Ma tâche:' | trier --unique | grep -cE 'Ma tâche' : Il imprime le nombre de motifs correspondants 'Ma tâche'

L'écart entre les deux dépend du contenu de votre fichier journal.

Pour répondre à votre question, laquelle utiliser: Lorsque vous utilisez grep avec -E comme vous l'avez fait, essayez de créer un motif apt, puis comptez les lignes.


0 commentaires

0
votes

Pas besoin de plusieurs commandes pour compter un nombre unique.

awk '/My task/ {a[$NF]++;c+=a[$NF]==1?1:0} END {print c}' file
3
  • / Ma tâche / la ligne contient-elle Ma tâche , si oui:
    • a [$ NF] ++ crée un tableau avec un nombre comme clé. La première fois qu'une valeur est trouvée, ce sera 1 , la deuxième fois 2 , la troisième fois la même valeur trouvée sera 3 etc
    • c + = a [$ NF] == 1? 1: 0 si le tableau a [nombre] vaut 1 (première fois trouvé), incrémenter c avec 1 , sinon ajoutez 0
  • {print c} imprimer le numéro du numéro unique de la variable c


0 commentaires