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)
原始问题:
问题很简单,但我没有找到可能,为此创建一个快速脚本.
我有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的所有文件.条件通常是模式匹配,但在文件内容的不同行上.
嗯,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)