Como encontrar várias strings em arquivos? [duplicado]

17

Eu uso o seguinte comando para encontrar arquivos com uma determinada string:

find /var/www/http -type f | xargs grep -iR "STRING1"

Mas como posso encontrar arquivos que incluam "STRING1" OU "STRING2" OU "STRING3"?

Este código não funciona:

find /var/www/http -type f | xargs grep -iR "STRING1" | xargs grep -iR "STRING2"
    
por SPnova 07.08.2013 / 12:47

3 respostas

23

POSIXly, usando grep com -E option:

find /var/www/http -type f -exec grep -iE 'STRING1|STRING2' /dev/null {} +

Ou -e :

find /var/www/http -type f -exec grep -i -e 'STRING' -e 'STRING2' /dev/null {} +

Com algumas implementações, pelo menos em sistemas GNU, OSX e FreeBSD, você pode escapar de | :

find /var/www/http -type f -exec grep -i 'STRING1\|STRING2' /dev/null {} +
    
por 07.08.2013 / 12:53
7

Para facilitar a manutenção (se sua lista de strings a pesquisar puder mudar no futuro), colocaria os padrões em um arquivo (por exemplo, patterns.txt) e usaria a opção -f ( -R é desnecessário se você estiver restringindo find aos arquivos; -H fornecerá o nome do arquivo caso haja apenas um; -F faz com que o grep trate os padrões que você está procurando como sequências e não expressões regulares, o que geralmente é o que você quer):

find /var/www/http -type f -exec grep -iHFf patterns.txt {} +
    
por 07.08.2013 / 14:21
5

O que há de errado em usar apenas egrep ?

egrep -r 'string1|string2|string3' /var/www/http
    
por 07.08.2013 / 12:52

Tags