Как искать несколько шаблонов поиска из файла с помощью grep

Если я ищу несколько строк поиска в grep : обычно просто делаю:

 grep "search1\|search2" somefolder/*.txt 

но, что, если у меня есть 100 или более строк поиска? Могу ли я сказать так:

 grep "stringPattern.txt" somefolder/*.txt 

где stringPattern.txt – это файл, содержащий список слов, которые нужно искать в *.txt .

grep имеет флаг -f точно для этого, используйте:

 grep -f patternfile somefolder/*.txt 

Если в patternfile шаблоны поиска разделяются по patternfile .

вы также можете работать с другим способом. если у вас есть 100 шаблонов для поиска, то создайте список, который вы не хотите искать, если он меньше 100 шаблонов и делает его в файле file1.txt

 grep -vf file1.txt somefolder/*.txt 

Я использовал perl для этого, так как вы можете использовать perl для создания регулярного выражения из массива:

 #!/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 ); } 

Примечание. quotemeta избежит метасимволов, что хорошо, если вы хотите искать вещи, включая обратную косую черту, пробелы и т. Д. Но это плохо, если вы хотите указать шаблоны регулярных выражений.