Como pesquisar vários padrões de pesquisa de um arquivo com grep

1

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 .

    
por dimas 09.09.2015 / 08:29

3 respostas

4

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.

    
por 09.09.2015 / 08:32
1

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
    
por 09.09.2015 / 08:35
0

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.

    
por 09.09.2015 / 14:42