awk/grep/sed:在我的文件中的一行中找到多个模式

awk/grep/sed: find multiple patterns at one line in my files

我在这里阅读了很多关于 awk 和变量的内容,但找不到我想要的。 我在目录($DIR)中有一些文件($FILES),我想在这些文件中搜索包含以下内容的所有行:两个字符串(SEARCH1 和 SEARCH2)。使用 sh (/bin/bash):我不想使用读取命令,所以我更喜欢 awk/grep/sed。想要的输出是包含 2 个字符串和对应的行。文件的文件名。 当我使用这段代码时,一切正常:

FILES="news_*.txt"
DIR="/news"

awk '/Corona US/&&/Infected/{print a[FILENAME]?[=11=]:FILENAME RS [=11=];a[FILENAME]++}' ${DIR}/${FILES}

现在我想用 awk 命令中的变量替换 2 个模式('Corona US' 和“Infected”),我试过:

SEARCH1="Corona US"
SEARCH2="Infected"

awk -v str1="$SEARCH1" -v str2="$SEARCH2" '/str1/&&/str2/{print a[FILENAME]?[=12=]:FILENAME RS [=12=];a[FILENAME]++}' ${DIR}/${FILES}

然而,这并没有给我正确的输出:结果是空的(没有找到任何东西)。

由于您没有显示输出示例,因此无法对其进行测试,基于试图修复它的 OP 代码。

awk -v str1="$SEARCH1" -v str2="$SEARCH2" 'index([=10=],str1) && index([=10=],str2){print (seen[FILENAME]++ ? "" : FILENAME ORS) [=10=];a[FILENAME]++}' ${DIR}/${FILES}

awk -v str1="$SEARCH1" -v str2="$SEARCH2" '[=11=] ~ str1 && [=11=] ~ str2{print (seen[FILENAME]++ ? "" : FILENAME ORS) [=11=];a[FILENAME]++}' ${DIR}/${FILES}

OP 的代码问题:我们无法在 /var/ 中搜索变量,应该使用 index[=14=] ~ str 样式。

并不是 100% 清楚您要查找的内容,但听起来 grep -H 具有备用模式可以让您输出文件名和匹配 $SEARCH1$SEARCH2 行中的任意位置。例如,您可以这样做:

grep -H "$SEARCH1.*$SEARCH2\|$SEARCH2.*$SEARCH1" "$DIR/"$FILES

注意 $FILES 必须 不被引用 以便 * 扩展发生。)

如果您只想要一个包含任何行匹配项的文件名列表,您可以将 -H 更改为 -l