在多个文本文件中搜索字符串

时间:2019-01-22 10:18:02

标签: python bash

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

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

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

results_text1.txt, results_text2.txt, results_textn.txt

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

3 个答案:

答案 0 :(得分:1)

一个解决方案可能是使用bash for loop。

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

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

答案 1 :(得分:1)

通过结合使用“ sed”和“ xargs”

echo "text1,text2,text3,textn" | sed "s/,/\n/g" | xargs -I{} sh -c "grep -ir {} * > result_{}"

答案 2 :(得分: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意味着用下划线替换非字母数字字符)以确保它作为文件名的一部分是安全的。