使用awk筛选含ubuntu和replicas的文件名失败,求解决方法
修复AWK命令以找出同时包含两个关键词的文件
你的问题出在原AWK命令的逻辑上——它只会在**同一行文本同时匹配到ubuntu和replicas时才打印文件名,但你实际需要的是整个文件中只要同时存在这两个关键词(不管在不在同一行)**就输出文件名。下面给你两种可行的修复方案:
方法1:修正AWK脚本逻辑
我们可以在AWK里跟踪每个文件中两个关键词的出现状态,等文件处理完再判断是否满足条件:
/ubuntu/{u=1} # 遇到ubuntu就标记u为1 /replicas/{r=1} # 遇到replicas就标记r为1 ENDFILE{ # 处理完当前文件时触发 if(u && r) print FILENAME u=0; r=0 # 重置标记,准备处理下一个文件 }
执行方式:
awk -f script.awk *.txt # 或者直接一行执行 awk '/ubuntu/{u=1} /replicas/{r=1} ENDFILE{if(u&&r) print FILENAME; u=0; r=0}' *.txt
方法2:用Grep组合实现更简洁
如果不需要用AWK,用grep的组合命令会更直观:
grep -l "ubuntu" *.txt | xargs grep -l "replicas"
-l参数让grep只输出匹配到的文件名,而不是具体行内容- 第一个
grep先筛选出包含ubuntu的文件,再通过xargs把这些文件传给第二个grep,筛选其中包含replicas的文件
处理带空格的文件名
如果你的文件名包含空格,需要加上-Z和-0参数来避免错误:
grep -lZ "ubuntu" *.txt | xargs -0 grep -l "replicas"
内容的提问来源于stack exchange,提问作者hichamx
相关产品推荐
相关产品推荐

