在bash中使用&&在输出中找到两个字符串

时间:2018-12-19 01:39:35

标签: bash sed xargs

如果要在输出中存在两个字符串,我想查找它们,然后通过管道将它们作为下一个命令的参数传递。

例如:

m_fCollisionTime

但我不知道如何实现上述目标。

我必须检查100个文件并删除其中包含这两个字符串的文件。如果有人存在,那么我不想删除文件。

3 个答案:

答案 0 :(得分:2)

如果您只想删除两个匹配项的文件,则awk是一种成熟的编程语言,可以提供一个独立检查标志的表达式,比{{1} }(它将根据是否找到 any 匹配项,而不是是否匹配给定的 all 表达式来修改退出状态)。

grep

等效于string1="first regex" string2="second regex" for ((x=1; x<=100; x++)); do file="log$x.txt" awk -v string1="$string1" -v string2="$string2" ' BEGIN { found1=0; found2=0; } $0 ~ string1 { found1=1; } $0 ~ string2 { found2=1; } END { exit(!(found1 && found2)) } ' "$file" && rm -f -- "$file" done 的效率要低得多,因为它必须读取每个文件两次:

grep

答案 1 :(得分:1)

您可以使用find进行此操作:

find . -name 'log*.txt' -exec grep -E 'string1' {} \; -exec grep -E 'string2' {} \; -exec rm {} \;

这将找到logN.txt,grep表示字符串1,如果匹配则grep表示字符串2,如果匹配则删除文件。

根据下面的注释,如果只想在当前目录中查找文件,请添加-maxdepth 1

答案 2 :(得分:0)

使用GNU Parallel:

parallel 'grep string1 log{}.txt && grep string2 log{}.txt && rm log{}.txt' ::: {1..100}

如果您要查看所有log * .txt文件,那么它会更短:

parallel 'grep string1 {} && grep string2 {} && rm {}' ::: log*.txt