Como pesquisar um arquivo para combinar linhas inteiras?

1

Eu tenho um comando que envia para stdout uma série de números, cada um em uma nova linha. Eu preciso determinar se um determinado número existe na lista. A partida precisa ser exata, não um subconjunto. Por exemplo, uma maneira simples de abordar isso que não funciona seria:

/run/command/outputing/numbers | grep -c <numberToSearch>

Minha versão disso dá um falso positivo na lista a seguir ao pesquisar por '456':

1234567
98765
23
1771

Se a contagem for diferente de zero, uma correspondência foi encontrada ou se foi zero, o número não está na lista.

O problema com isso é que o numberToSearch poderia corresponder a uma subsequência de números em uma linha, em vez disso, eu quero apenas hits em toda a linha. Eu olhei para a página man do grep e não vi nenhuma maneira de combinar apenas linhas inteiras. Existe uma maneira de fazer isso, ou seria melhor usar awk ou sed ou alguma outra ferramenta? Eu preciso de uma resposta binária para saber se o número que está sendo procurado está presente ou não.

    
por WilliamKF 12.09.2012 / 20:57

3 respostas

1

Adicionando a resposta do Ansgar , considere -l (letra minúscula L ) de -c . Ele ( -l ) lhe dará uma resposta sim ou não.

/run/command/outputting/numbers | grep –l '^456$'

emitirá " (standard input) " e sairá com um status 0 se uma linha correspondente for encontrada; se o texto não for encontrado, ele não produzirá nada e sairá com um status 1. Algumas versões de grep também suportam uma opção -q (silenciosa), que suprime toda a saída e fornece apenas o status de saída.

Eles têm a vantagem de poderem sair ao encontrar a string de pesquisa pela primeira vez e não precisam ler a entrada inteira. Se você precisar que seu comando seja executado até a conclusão, essas opções podem ser prejudiciais.

    
por 12.09.2012 / 21:38
5

Do manual do GNU grep:

'-x'
'--line-regexp'
     Select only those matches that exactly match the whole line.
     ('-x' is specified by POSIX.)

Então:

/run/command/outputing/numbers | grep -x <numberToSearch>

Você receberá as correspondências de linha inteira:

/run/command/outputing/numbers | grep -cx <numberToSearch> 

Você receberá o número de correspondências completas.

    
por 13.09.2012 / 10:23
2
num=23
/run/command/outputing/numbers | grep -c "^$num$"

Substitua 23 pelo número que você está procurando.

    
por 12.09.2012 / 21:01

Tags