Como encontrar arquivos contendo duas strings juntos no Linux?

7

Eu quero encontrar arquivos contendo duas strings juntos, por exemplo, o arquivo contém string1 e string2 .

Eu quero o caminho completo dos arquivos na saída. Não quero ver avisos de "permissão negada".

    
por alwbtc 15.06.2012 / 20:21

5 respostas

11
grep -l string2 'grep -l string1 /path/*'

que é o mesmo que

grep -l string2 $(grep -l string1 /path/*)

Edit: heres porque grep string1 /path/* | grep string2 não faz o que eu acho que alwbtc quer.

$ cd /tmp
$ cat a
apples
oranges
bananas
$ cat b
apples
mangoes
lemons
$ cat c
mangoes
limes
pears
$ cd ~
$ grep apples /tmp/* | grep mangoes
$

Nada foi encontrado, mas o arquivo b contém as duas strings.

Aqui está o que eu acho que o alwbtc quer

$ grep -l apples $(grep -l mangoes /tmp/*)
/tmp/b
    
por 15.06.2012 / 20:47
2

Pipe um grep para outro:

grep "string1" /path/to/files/* | grep "string2"

    
por 15.06.2012 / 20:41
1

Aqui está o comando ack equivalente "https: //superuser.com/a/437397/197238">RedGrittyBrick's answer :

ack string2 $(ack string1 -l)

Funciona da mesma maneira (exceto ack , por padrão, procura o diretório atual recursivamente). O conteúdo dentro do $() procura por string1 mas -l gera apenas os nomes de arquivos onde essa cadeia foi encontrada. Eles são então passados como argumentos no comando externo, o que significa que string2 é procurado apenas dentro dessa lista de arquivos.

    
por 07.10.2016 / 07:00
0
comm -12 <(grep --fixed-strings --files-with-matches "STRING1" /path/to/files/* 2>/dev/null | sort) <(grep --fixed-strings --files-with-matches "STRING1" /path/to/files/* 2>/dev/null | sort)

ou com menos redundância:

search_files () { str="$1"; shift; grep -Fl "$str" "$@" 2>/dev/null | sort; }
comm -12 <(search_files "STRING1" /path/to/files/*) <(sf "STRING2" /path/to/files/*)

Isso funcionará se as strings estiverem em linhas diferentes do mesmo arquivo e também evitará falsos positivos se um nome de arquivo contiver uma das strings.

    
por 15.06.2012 / 23:17
0

Para elaborar a solução @ RedGrittyBrick que possui uma falha ao executar o comando autônomo plus para suprimir a saída de erro como pretendido e para localizar arquivos recursivamente, você pode considerar

grep -l 'STRING1' $(! grep -lrs 'STRING2' /absolute/path/to/search/dir && echo /dev/null)

A opção

-s suprimirá as mensagens de erro
-r opção permite procurar por strings em diretórios aninhados arbitrariamente
! combinado com && echo /dev/null garante que o comando não será desativado. Caso contrário, se o inner grep não encontrar nenhum arquivo, ele não produzirá nada, de forma que outer grep esperará indefinidamente que a entrada seja pesquisada. Essa solução gera /dev/null nesses casos, então outer grep procurará STRING1 em /dev/null onde é suposto não encontrar nada.

    
por 11.09.2013 / 13:05

Tags