我的磁盘上有数千个文本文件。我需要根据选定的单词来搜索它们。目前,我使用:
grep -Eri 'text1|text2|text3|textn' dir/ > results.txt
结果保存到一个文件中:results.txt 我希望将结果保存到多个文件中。
results_text1.txt, results_text2.txt, results_textn.txt
也许有人遇到过某种脚本,例如在 python 中?
通过使用“sed”和“xargs”的组合
echo "text1,text2,text3,textn" | sed "s/,/\n/g" | xargs -I{} sh -c "grep -ir {} * > result_{}"
一种解决方案可能是使用 bash for 循环。
for word in text1 text2 text3 textn; do grep -Eri '$word' dir/ > results_$word.txt; done
您可以直接从命令行运行它。
一种方法(使用 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意味着用下划线替换非字母数字字符)以确保它作为文件名的一部分是安全的。