Comment empêcher grep d'imprimer plusieurs fois la même chaîne?

15

Si je grep un fichier contenant les éléments suivants:

These are words
These are words
These are words
These are words

... pour le mot These, il imprimera la chaîne These are wordsquatre fois.

Comment empêcher grep d'imprimer plusieurs fois des chaînes récurrentes? Sinon, comment puis-je manipuler la sortie de grep pour supprimer les lignes en double?

Trae
la source
Faut-il conserver l'ordre des correspondances dans la sortie? Sinon, la commande publiée par John1024 fonctionnera.
kos

Réponses:

23

La philosophie Unix est d'avoir des outils qui font une chose et les font bien. Dans ce cas, grepest l'outil qui sélectionne le texte d'un fichier. Pour savoir s'il y a des doublons, on trie le texte. Pour supprimer les doublons, on utilise l' -uoption pour sort. Donc:

grep These filename | sort -u

sorta de nombreuses options: voir man sort. Si vous voulez compter les doublons ou avez un schéma plus compliqué pour déterminer ce qui est ou non un doublon, dirigez la sortie de tri vers uniq: grep These filename | sort | uniqet voyez manuniq` pour les options.

John1024
la source
2

Utilisation d' grepun commutateur supplémentaire si vous ne recherchez qu'une seule chaîne

grep -m1 'These' filename

De man grep

-m NUM, --max-count=NUM
        Stop reading a file after NUM matching lines.  If the input is
        standard input from a regular file, and NUM matching lines are
        output, grep ensures that the standard input is positioned  to
        just  after  the  last matching  line  before exiting, regardless
        of the presence of trailing context lines.  This enables a calling
        process to resume a search.  When grep stops after NUM matching
        lines, it outputs any trailing context lines.  When the -c or
        --count option is also used, grep does not output a count greater
        than NUM.  When the -v or --invert-match option is also used, grep
        stops after outputting NUM non-matching lines.

ou en utilisant awk ;)

awk '/These/ {print; exit}' foo
UN B
la source
À mon humble avis, la réponse la plus appropriée est le drapeau -m. Je vous suggère de le mettre en haut de votre réponse. Très bonne réponse!
Sergiy Kolodyazhnyy
3
Cela ne fonctionnera pas si vous utilisez une expression régulière - elle s'arrêtera immédiatement après la première correspondance, ne vous assurez pas d'en obtenir une et une seule de chaque correspondance possible.
csvan