使用带有 AND 条件的 grep -E (例如:(?=/fo)^(?=/mo))

使用带有 AND 条件的 grep -E (例如:(?=/fo)^(?=/mo))

我几乎没费什么力气就搞清楚了如何获取包含以下内容的文件列表:

  1. 其中有字符串“/fo”
  2. 但没有字符串“/mo”

我试图弄清楚在包含大量文本文件的文件夹中...我的尝试没有成功......

  • grep -lE '(?=/fo)^(?=/mo)' *
  • grep -E'(fo)(mo)'*

我被困在这里...有什么建议吗?

答案1

我认为您无法使用 一次性完成此操作grep

两遍 grep 解决方案

该解决方案用于find将当前目录中的文件传递到 while 循环,然后执行所需的 grep:

find . -maxdepth 1 -type f -print0 | while IFS= read -r -d $'\0' file; do
  grep -q '/mo' "$file" || grep -l '/fo' "$file" 
done

一次性 GNU awk 解决方案

解析.awk

BEGINFILE { f1 = f2 = 0 }
$0 ~ pat1 { f1 = 1 }
$0 ~ pat2 { f2 = 1 }
ENDFILE   { if(f1 && !f2) print FILENAME }

像这样运行:

awk -f parse.awk pat1='/fo' pat2='/mo' *

解释

GNU awk 具有BEGINFILEENDFILE功能,它们是在输入文件的开头和结尾执行的块。这使我们能够在看到模式时翻转标志。

上述示例根据当前输入文件中是否存在和来设置两个标志f1和。因此,该块知道当前输入文件中是否存在这两种模式,并且可以执行适当的测试。f2pat1pat2ENDFILE

相关内容