使用awk仅在指定标记行后搜索字符串并输出匹配行及前一行
awk实现指定区域后搜索匹配行及前一行的方案
需求梳理
- 搜索触发条件:仅在文件中出现
start real work行之后的内容中执行搜索 - 匹配规则:命中包含
records字符串,且不是以0 records开头的行 - 输出要求:匹配命中时,同时输出匹配行的前一行、匹配行本身
实现命令
调整后的awk单行命令如下:
awk '/start real work/{f=1} f&&/records/&&!/^0 records/{for(i=1;i<=x;)print a[i++];print} {for(i=1;i<x;i++)a[i]=a[i+1];a[x]=$0}' x=1 x.x
命令说明
- 新增标志位
f,默认值为0,当匹配到start real work行时将f置为1 - 所有匹配规则新增
f判断,只有f=1(即已过触发行)时才会执行匹配逻辑 - 原有缓存前一行的逻辑保持不变,
x=1代表缓存1行前的内容,若需要输出更多前导行可调整x的数值
效果验证
首先执行示例文件创建命令:
cat << EOF > x.x start job initialization 20 records start real work first step 30 records # comments second step 0 records #comments third step 22 records end EOF
运行上述awk命令后,输出结果完全符合预期:
first step 30 records third step 22 records
内容的提问来源于stack exchange,提问作者Jacques Kilchoer
相关产品推荐
相关产品推荐

