Jak zapobiec wielokrotnemu drukowaniu tego samego ciągu przez grep?


15

Jeśli grepuje plik zawierający następujące elementy:

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

... dla słowa These, wypisze ciąg These are wordscztery razy.

Jak mogę zapobiec, aby grep drukował powtarzające się ciągi więcej niż raz? W przeciwnym razie, jak mogę manipulować wyjściem grep, aby usunąć zduplikowane linie?


Czy kolejność dopasowań powinna być zachowana na wyjściu? W przeciwnym razie zadziała polecenie John1024.
Kos

Odpowiedzi:


23

Filozofią Uniksa jest posiadanie narzędzi, które wykonują jedną rzecz i robią je dobrze. W tym przypadku grepjest narzędziem, które zaznacza tekst z pliku. Aby dowiedzieć się, czy są duplikaty, sortuje się tekst. Aby usunąć duplikaty, można -uskorzystać z opcji sort. A zatem:

grep These filename | sort -u

sortma wiele opcji: patrz man sort. Jeśli chcesz policzyć duplikaty lub mieć bardziej skomplikowany schemat określania, co jest duplikatem, a co nie, należy przesłać dane wyjściowe sortowania do uniq: grep These filename | sort | uniqi zobaczyć manopcje uniq`.


2

Używanie grepi dodatkowy przełącznik, jeśli szukasz tylko jednego ciągu

grep -m1 'These' filename

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

lub za pomocą awk ;)

awk '/These/ {print; exit}' foo

IMHO najbardziej odpowiednią odpowiedzią jest flaga -m. Sugeruję, abyś umieścił go na górze swojej odpowiedzi. Bardzo dobra odpowiedź!
Sergiy Kolodyazhnyy

3
To nie zadziała, jeśli używasz wyrażenia regularnego - zatrzyma się natychmiast po pierwszym dopasowaniu, nie upewniając się, że otrzymujesz jedno i tylko jedno z możliwych dopasowań.
csvan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.