Como eu posso combinar o grep com o arquivo e extra regex

1

Eu tenho um arquivo de strings em cada linha.

Por exemplo:

AAAAA   
BBBBB   
CCCCC  
etc  

Eu quero verificar cada seqüência de caracteres, um por um, se existe em uma série de arquivos em um diretório específico.

Eu sei que posso fazer: grep -f filename para fazer a pesquisa. Mas o que preciso é usar mais uma expressão regular por linha para obter resultados mais específicos. O arquivo com as strings é grande e muda frequentemente, portanto, não faz sentido modificar cada linha para adicionar uma expressão.

Então, o que eu preciso é combinar o grep -f filename para fazer um loop em cada linha do arquivo (e grep para ele nos arquivos), mas adicionar mais algumas condições. Por exemplo. que AAAAA existe e [0-9]{1,3}$ também existe na mesma linha.

    
por Jim 21.08.2013 / 22:57

2 respostas

3

Você pode fazer isso passo a passo com grep e um pipeline

grep -f your_file list_of_files|grep -E extra_condition

ou

while read line; do
    grep -E -e "$line" -e extra_condition list_of_files
done < your_file

Em ambos os casos, a opção -E é necessária se você for usar um padrão no formato [0-9]{1,3}$ (ou seja, contendo quantificadores numéricos).

Editar

Graças ao comentário de Drav Sloan, sabemos que a segunda versão (o while loop), não só pode ser reduzida para

grep -E -e "extra_condition" -f your_file list_of_files

mas ele realmente procura por um padrão ou o outro não um padrão e o outro. Você deve ficar com o primeiro formulário.

    
por 21.08.2013 / 23:03
1

Só para mostrar uma maneira alternativa usando awk e grep .

Dados de amostra

$ cat patterns.txt 
AAAA
BBBB
CCCC
DDDD
EEEE

$ cat sample.txt 
AAAA 1
AAAA 2
AAAA 3
AAAA 4
DDDD 1
DDDD 2
YYYY 1
YYYY 2

Exemplos

awk # 1:

$ awk 'FNR==NR{a[$0]; next}($1 in a)' patterns.txt sample.txt | grep -E "[0-9]{1,3}$"
AAAA 1
AAAA 2
AAAA 3
AAAA 4
DDDD 1
DDDD 2

Isso provavelmente precisará ser ajustado, mas dá uma dica de como fazê-lo.

awk # 2:

$ awk 'FNR==NR{a[$0];next};{for (i in a){if (match($0,i)) print}}' patterns.txt sample.txt | grep -E "[0-9]{1,3}$"
AAAA 1
AAAA 2
AAAA 3
AAAA 4
DDDD 1
DDDD 2

Este é mais flexível, ele pode manipular as cadeias de caracteres de padrão em qualquer lugar dentro da linha dos dados de amostra.

    
por 21.08.2013 / 23:30