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
。
我在这里阅读了很多关于 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
。