Como impedir que o grep imprima a mesma sequência várias vezes?


14

Se eu grep um arquivo contendo o seguinte:

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

... para a palavra These, imprimirá a sequência These are wordsquatro vezes.

Como impedir que o grep imprima seqüências recorrentes mais de uma vez? Caso contrário, como posso manipular a saída do grep para remover linhas duplicadas?


A ordem das correspondências deve ser mantida na saída? Caso contrário, o comando que John1024 postou funcionará.
kos

Respostas:


21

A filosofia do Unix é ter ferramentas que fazem uma coisa e as fazem bem. Nesse caso, grepé a ferramenta que seleciona texto de um arquivo. Para descobrir se há duplicatas, classifique o texto. Para remover as duplicatas, use a -uopção para sort. Portanto:

grep These filename | sort -u

sorttem muitas opções: veja man sort. Se você deseja contar duplicados ou possuir um esquema mais complicado para determinar o que é ou não duplicado, canalize a saída de classificação para uniq: grep These filename | sort | uniqe veja manuniq` para obter opções.


2

Usando grepe uma opção adicional, se você estiver procurando apenas uma única sequência

grep -m1 'These' filename

A partir 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 usando awk ;)

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

IMHO a resposta mais apropriada é a bandeira -m. Eu sugiro que você coloque no topo da sua resposta. Resposta muito boa!
Sergiy Kolodyazhnyy 05/10

3
Isso não funcionará se você estiver usando um regex - ele será interrompido imediatamente após a primeira correspondência, não se esqueça de obter uma e apenas uma de cada correspondência possível.
csvan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.