-1

我的磁盘上有数千个文本文件。我需要根据选定的单词来搜索它们。目前,我使用:

grep -Eri 'text1|text2|text3|textn' dir/ > results.txt

结果保存到一个文件中:results.txt 我希望将结果保存到多个文件中。

results_text1.txt, results_text2.txt, results_textn.txt

也许有人遇到过某种脚本,例如在 python 中?

4

3 回答 3

1

通过使用“sed”和“xargs”的组合

echo "text1,text2,text3,textn" | sed "s/,/\n/g" | xargs -I{} sh -c "grep -ir {} * > result_{}"
于 2019-01-22T10:40:32.967 回答
1

一种解决方案可能是使用 bash for 循环。

for word in text1 text2 text3 textn; do grep -Eri '$word' dir/ > results_$word.txt; done

您可以直接从命令行运行它。

于 2019-01-22T10:35:11.863 回答
0

一种方法(使用 Perl,因为它更容易用于正则表达式和单行)。

样本数据:

% mkdir dir dir/dir1 dir/dir2
% echo -e "text1\ntext2\nnope" > dir/file1.txt
% echo -e "nope\ntext3" > dir/dir1/file2.txt
% echo -e "nope\ntext2" > dir/dir1/file3.txt

搜索:

% find dir -type f -exec perl -ne '/(text1|text2|text3|textn)/ or next; 
    $pat = $1; unless ($fh{$pat}) { 
      ($fn = $1) =~ s/\W+/_/ag; 
      $fn = "results_$fn.txt"; 
      open $fh{$pat}, ">>", $fn;
    }
    print { $fh{$pat} } "$ARGV:$_"' {} \;

results_text1.txt 的内容:

dir/file1.txt:text1

results_text2.txt 的内容:

dir/dir2/file3.txt:text2
dir/file1.txt:text2

results_text3.txt 的内容:

dir/dir1/file2.txt:text3

笔记:

  • 您需要将模式放在括号内以捕获它。grep不允许这样做。

  • 然后过滤捕获的模式(s/\W+/_/ag意味着用下划线替换非字母数字字符)以确保它作为文件名的一部分是安全的。

于 2019-01-22T10:45:54.070 回答