grep
tem o sinal -f
exatamente para isso, use:
grep -f patternfile somefolder/*.txt
Em que patternfile
os padrões de pesquisa são separados linha por linha.
Se eu pesquisar várias strings de pesquisa em grep
: normalmente basta:
grep "search1\|search2" somefolder/*.txt
mas, e se eu tiver 100 ou mais strings de pesquisa? Posso dizer assim:
grep "stringPattern.txt" somefolder/*.txt
em que stringPattern.txt
é um arquivo que contém uma lista de palavras que preciso pesquisar em *.txt
.
você também pode trabalhar de outra maneira. se você tem 100 padrões para pesquisar, então faça uma lista que você não quer pesquisar se tiver menos de 100 padrões e faça isso em um arquivo1.txt
grep -vf file1.txt somefolder/*.txt
Eu usei o perl para fazer isso, pois você pode usar o perl para construir um regex a partir de um array:
#!/usr/bin/perl
use strict;
use warnings;
open ( my $searchfile, '<', "searchfile.txt" ) or die $!;
my @search_for = <$searchfile>;
close ( $searchfile );
my $search_regex = join ( "|", map {quotemeta} @search_for );
$search_regex = qr/$search_regex/;
print "Regex: $search_regex\n";
foreach my $file ( glob ( "somefolder/*.txt" ) ) {
open ( my $check, '<', $file ) or die $!;
while ( <$check> ) {
print if m/$search_regex/;
}
close ( $check );
}
Nota - quotemeta
irá escapar de metacaracteres, o que é bom se você quiser procurar coisas incluindo barras invertidas, espaços, etc. Mas ruim se você quiser especificar padrões de regex.