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?
3 Réponses :
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
Problème:
uniq
etsort -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.
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
Il n'y aura aucune correspondance si vous utilisez
Ma tâche
cargrep
est sensible à la casse par défaut.