grep não combina e combina [duplicado]

3

Eu tenho o seguinte grep

grep -r --color -L "class public interface" * | grep "authenticate"

Eu quero que ele traga de volta arquivos que não contenham "interface pública de classe" em nenhum lugar do arquivo, mas contenham "autenticar".

Mas o que eu tenho não está funcionando como esperado. Existe um arquivo que eu sei que deve aparecer, pois não contém "interface pública de classe", mas contém "autenticar"

Há algo errado no meu comando?

    
por Arya 25.01.2018 / 05:03

1 resposta

8

Assim como -L procura conteúdo de um arquivo sem correspondência, -l pesquisa o conteúdo de um arquivo com uma correspondência.

Portanto, você precisará especificar o -l flag no segundo "grepping".

Além disso, você precisará direcionar a saída do primeiro grep para o segundo como argumentos da linha de comando. Isso pode ser feito usando xargs , que é uma ferramenta para ler itens da entrada padrão. Piping os nomes dos arquivos diretamente faria o segundo grep procurar pela string authenticate no arquivo nomes .

então você deve acabar com algo como

grep -r --color -L "class public interface" * | xargs grep -l "authenticate"'

Observe que xargs , por padrão, divide a entrada em qualquer espaço em branco. Portanto, se você tiver nomes de arquivos com espaços (ou piores), será necessário usar grep -Z e xargs -0 para separar os nomes de arquivo por NUL bytes em vez disso. (No GNU grep, isto é, outros podem ser diferentes, por exemplo, o FreeBSD grep tem --null ).

    
por 25.01.2018 / 05:25

Tags