Unix脚本用于搜索必须包含两个特定关键字的文本文件

bas*_*ero 2 unix bash search grep

解决方案:(感谢Zsolt Botykai和Mike Ryan)

以下脚本到awk一行的准确翻译是:

find /home/data/ -type f -exec awk '/PATTERN1/ {c++} /PATTERN2/ {d++} c>0 && d>0 {print ARGV[1] ; exit 0 } END { if (! c || ! d) {exit 1}}' \{\} \; > assetsToDelete.txt 2>&1
Run Code Online (Sandbox Code Playgroud)

请参阅/sf/answers/660993511/

原始问题:

问题很简单,但我没有找到可能,为此创建一个快速脚本.

我有100'000个文本文件,我需要搜索所有那些满足两个条件的文件.

我的脚本看起来像这样,但它像地狱一样缓慢...更好的主意?

echo Searching for first criteria...
date
grep -rl 'PATTERN1' /home/data/assets/ > assets.txt
file=assets.txt

echo Now filtering for second criteria
date
for i in `cat $file`
do
  grep -l 'PATTERN2' $i >> assetsToDelete.txt
done
echo DONE
date
Run Code Online (Sandbox Code Playgroud)

所以我正在寻找这样的可能性:

搜索目录并过滤掉一步完成条件1和条件2的所有文件.条件通常是模式匹配,但在文件内容的不同行上.

Zso*_*kai 7

嗯,awk你可以这样做:

awk '/FIRSTPATTERN/ {c++}
     /SECONDPATTERN/ {d++}
     c>0 && d>0 {print ARGV[1] ; exit 0 } 
     END { if (! c || ! d) {exit 1}}' INPUTFILE
Run Code Online (Sandbox Code Playgroud)

现在您可以使用它:

find /YOUR/PATH -type f -exec \
awk '/FIRSTPATTERN/ {c++}
     /SECONDPATTERN/ {d++}
     c>0 && d>0 {print ARGV[1] ; exit 0 } 
     END { if (! c || ! d) {exit 1}}' \{\} \;
Run Code Online (Sandbox Code Playgroud)

  • 返回退出状态会很有用.类似于:'{exit!c || !d}' (3认同)