Como percorrer vários arquivos usando linhas de dois arquivos de entrada como início e fim do padrão?

3

Eu gostaria de escrever um script simples que usaria o grep para pesquisar uma lista de arquivos. O código atual parece algo semelhante a isto:

a= file1.txt 

b= file2.txt

for

do

grep '$a.*$b' /root/listoffiles/*php >> found.txt

concluído

file1 e file2 são ambas as listas de palavras. Então, isso procuraria pelo destino com vários critérios. Por exemplo, $a poderia ser "olá" e $b "mundo" ou a segunda linha poderia ser "vermelho" e "camiseta". Se encontrar algo com dois critérios de correspondência, basta salvá-lo no arquivo. O loop que estou usando não está funcionando e não é eficiente o suficiente. Eu gostaria de obter apenas os resultados para atender aos critérios. Alguma sugestão?

    
por Stephen 13.03.2017 / 15:53

2 respostas

2

Você teria primeiro que escapar dos caracteres especiais nesses dois arquivos (se houver) e depois se juntar a eles por meio de, por exemplo, paste para finalizar com uma lista de padrões que você usaria via grep ' -f ... e, a menos que tenha muitos arquivos, não é necessário um loop, pois grep aceita vários argumentos:

paste -d'.*' <(sed 's/[.[\*^$]/\&/g' file1.txt) /dev/null \
<(sed 's/[.[\*^$]/\&/g' file2.txt) | grep -f - /root/listoffiles/*php >> found.txt
    
por 13.04.2017 / 14:36
0

Construa um padrão a partir das listas de palavras. De file1.txt contendo, e. one , un , eins e file2.txt contendo two , deux , zwei , você precisa obter a expressão regular (na sintaxe ERE)

(one|un|eins).*(two|deux|zwei)

Se as listas de palavras não contiverem caracteres especiais em um regex, tudo o que você precisa fazer é substituir as novas linhas por | (o operador “ou”), exceto o final.

words1=$(tr '\n' '|' <file1.txt); words1=${words1%\|}
words2=$(tr '\n' '|' <file2.txt); words2=${words2%\|}
grep -E "($words1).*($words2)"

Se as listas de palavras puderem conter caracteres especiais, será necessário citá-las.

words1=$(<file1.txt tr '\n' '|' | sed 's/[][\().*?+|]/\&/g'); words1=${words1%\|}
words2=$(<file2.txt tr '\n' '|' | sed 's/[][\().*?+|]/\&/g'); words2=${words2%\|}
grep -E "($words1).*($words2)"

Observe que, se você não se importar com a ordem das palavras e aceitar correspondências sobrepostas (por exemplo, aceitar twone como contendo one e two ), tudo o que você precisa é de duas invocações grep:

grep -f file1.txt | grep -f file2.txt
    
por 14.03.2017 / 02:33

Tags