Como pesquisar dois padrões em vários arquivos

2

Eu tenho vários arquivos em vários diretórios e preciso de um comando grep que possa retornar a saída somente quando ambos os padrões estiverem presentes no arquivo. Os padrões são como AccessToken e Registrationrequest . Os padrões não estão na mesma linha. AccessToken pode estar em uma linha e Registrationrequest pode estar em outra linha. Pesquise também o mesmo recursivamente em todos os arquivos em todos os diretórios.

Tentei

grep -r "string1” /directory/file |  grep "string 2” 
grep -rl 'string 1' | xargs grep 'string2' -l /directory/ file
grep -e string1 -e string2 

Nada funciona

Alguém por favor pode ajudar?

    
por user1573232 19.04.2018 / 04:39

4 respostas

4

Apenas para o caso de os arquivos serem muito grandes e fazer com que dois passes sejam caros e você queira apenas os nomes dos arquivos, usando find + awk :

find . -type f -exec awk 'FNR == 1 {a=0; r=0} /AccessToken/{a=1} /Registrationrequest/{r=1} a && r {print FILENAME; nextfile}' {} +
  • definimos duas variáveis de sinalização a e r para quando os padrões correspondentes foram encontrados, limpos no início de cada arquivo ( FNR == 1 )
  • quando as duas variáveis são verdadeiras, imprimimos o nome do arquivo e passamos para o próximo arquivo.
por muru 19.04.2018 / 06:13
6

O comando a seguir pode imprimir quando o arquivo corresponde aos critérios de pesquisa:

grep -Zril 'String1' | xargs -0 grep -il 'String2'

Aqui está um exemplo:

~/tmp$ ls
Dir1  Dir2  File1  File2

cat File1
AccessToken is not here
Registrationrequest it is here

cat File2
iAccess
ByteMe Registrationrequest

Eu copiei File1 e File2 para Dir1 e Dir2 para testes:

~/tmp$ grep -Zril 'AccessToken' | xargs -0 grep -il 'Registrationrequest'
File1
Dir2/File1
Dir1/File1

Então, se você quiser ver o que há nos arquivos, adicione o seguinte ao final da pesquisa:

xargs grep -E "AccessToken|Registrationrequest"

Exemplo:

~/tmp$ grep -Zril 'AccessToken' | xargs -0 grep -il 'Registrationrequest' | xargs grep -E "AccessToken|Registrationrequest"
File1:AccessToken is not here
File1:Registrationrequest it is here
Dir2/File1:AccessToken is not here
Dir2/File1:Registrationrequest it is here
Dir1/File1:AccessToken is not here
Dir1/File1:Registrationrequest it is here

Espero que isso ajude!

    
por Terrance 19.04.2018 / 05:44
2
grep -Erzl 'STR1.*STR2|STR2.*STR1'

em que a opção -z acaba sugando os arquivos como uma única linha.

Mais precisamente:

grep -Erzl 'AccessToken.*Registrationrequest|Registrationrequest.*AccessToken'
    
por JJoao 20.04.2018 / 01:10
1

while loop

Isso pode não ser tão inteligente ou eficiente quanto outras soluções, mas funciona:

while read -rd '' filename; do
    if grep -q "AccessToken" "$filename" && 
        grep -q "Registrationrequest" "$filename"
    then
        echo "$filename"
    fi
done < <(find . -type f -print0)
    
por wjandrea 20.04.2018 / 01:41