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



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

FILES="news_*.txt"
DIR="/news"
awk '/Corona US/&&/Infected/{print a[FILENAME]?$0:FILENAME RS $0;a[FILENAME]++}' ${DIR}/${FILES}

现在我想用awk命令中的变量替换2个模式("Corona US"one_answers"Infected"(,我尝试了:

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

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

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

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

OR

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

OP的代码问题:我们不能在应该像index$0 ~ str样式一样使用的/var/中搜索变量。

您要查找的内容并不是100%清楚,但听起来grep -H和其他模式可以让您在行中的任何位置输出文件名和与$SEARCH1$SEARCH2匹配的行。例如,你可以做:

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

(注意必须不引用$FILES才能进行*扩展。(

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

最新更新