pesquisando várias strings em vários arquivos dentro de um diretório e imprimindo a string e o nome do arquivo correspondente onde foi encontrado

2

Tenho cerca de 500 strings e quero procurar os arquivos que os contêm dentro de um diretório e obter os nomes dos arquivos que contêm as strings. Até agora eu tenho usado:

find -name 'LYFNRE.*' -exec grep -f file1.txt {} \; -print

mas o problema é que uma string pode ser encontrada em muitos arquivos, por isso é difícil encontrar quais strings estão presentes e quais estão faltando devido à grande saída. Você pode me ajudar a imprimir as strings com seus nomes de arquivo correspondentes onde elas foram encontradas?

    
por Jay 18.06.2014 / 06:22

3 respostas

2

Você deve apenas deixar grep fornecer os nomes dos arquivos. O GNU grep pode fazer isso:

grep -HFf ../strings.txt *

Isso apresentará a saída que se parece com:

[filename]:[matched_line]

... para cada correspondência em todos os arquivos no diretório. Você também pode obter números de linha:

grep -HnFf ../strings.txt *

... que fornece ...

[filename]:[line_number]:[matched_line]
    
por 18.06.2014 / 07:19
1

O problema é que você está passando um arquivo de cada vez para grep . Quando grep vê um único arquivo em sua linha de comando, presume que você saiba exatamente onde está pesquisando, por isso não exibe o nome do arquivo antes das correspondências.

Um truque para forçar grep a sempre dar saída a um nome de arquivo é também passar /dev/null (onde não haverá correspondência alguma vez). Algumas implementações do grep têm uma opção para isso: -H .

Além disso, você pode usar -exec … {} + em vez de -exec … {} \; para executar o programa para muitos arquivos de uma só vez. Isso é mais rápido. Você ainda deve passar /dev/null ou -H , porque pode acontecer que o comando seja invocado exatamente em um arquivo, seja porque há um único arquivo correspondente ou porque há muitas correspondências exigindo que grep seja invocado várias vezes e uma vez acontece a um único arquivo.

find -name 'LYFNRE.*' -exec grep -f file1.txt /dev/null {} +

O GNU grep e implementações recentes do BSD (incluindo OSX) suportam opções para chamar grep recursivamente sem requerer find .

grep -R --include='LYFNRE.*' -f file1.txt -H .

Alternativamente, você pode fazer globalização recursiva em seu shell. Em zsh, isso funciona fora da caixa. No bash, você precisa executar shopt -s globstar primeiro, e cuidado com o bash que recorre através de links simbólicos para diretórios (diferente de find ou zsh).

grep -f file1.txt /dev/null **/LYFNRE.*
    
por 19.06.2014 / 03:28
0

use egrep:

egrep -n "str1|str2|str3" file_names

-n imprime o número da linha no arquivo específico em que a string foi encontrada

    
por 18.06.2014 / 09:16

Tags