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