我的磁盘上有数千个文本文件。 我需要根据所选单词搜索它们。 目前,我使用:
grep -Eri 'text1|text2|text3|textn' dir/ > results.txt
结果保存到文件:results.txt 我希望将结果保存到许多文件中。
results_text1.txt, results_text2.txt, results_textn.txt
也许有人遇到过某种脚本,例如在python中?
答案 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
意味着用下划线替换非字母数字字符)以确保它作为文件名的一部分是安全的。