AWK的双模式匹配

版权声明:@抛物线 https://blog.csdn.net/qq_28513801/article/details/83511408
文件a有如下内容

1,2,3,4,5,6
7,8,9
10,11,12,13
22
hehe
1234

 请解释以下命令的具体含义

① awk ‘/2/1{print}’ a
1,2,3,4,5,6
7,8,9
10,11,12,13
22
hehe
1234
②awk ‘/2/,/2/0’ a
1,2,3,4,5,6
10,11,12,13
22
1234
③awk ‘/2/,/2/1’ a
1,2,3,4,5,6
10,11,12,13
22
1234
④awk ‘/2/,0’ a
1,2,3,4,5,6
7,8,9
10,11,12,13
22
hehe
1234
⑤awk ‘/2/,1’ a
1,2,3,4,5,6
10,11,12,13
22
1234
⑥awk ‘/2/,/2/’ a
1,2,3,4,5,6
10,11,12,13
22
1234

结论就是: 正则表达式匹配结果与任何东西做字符串连接操作, 结果永远为真.

①awk ‘/2/1{print}’ a
pattern 为: /2/1, 正则表达式匹配结果返回布尔值, 要么真(True), 要么假(False), 结果与1结合, 是做的字符串连接操作, 所以pattern结果是字符串, 非空的字符串pattern为真, pattern永远为真.

②awk ‘/2/,/2/0’ a 第一个pattern匹配成功时为真, 第二个pattern永远为真.注意这里的0,不是假,而是把0当成字符串

③awk ‘/2/,/2/1’ a 第一个pattern匹配成功时为真, 第二个pattern永远为真.

④awk ‘/2/,0’ a 第一个pattern匹配成功时为真, 第二个pattern为数字0, 永远为假.
例如: awk ‘/root/,0’ /etc/passwd 打印匹配到root的行,到文件结束

⑤awk ‘/2/,1’ a 第一个pattern匹配成功时为真, 第二个pattern为数字1, 永远为真.
匹配到/etc/passwd的root下一行
awk ‘/root/,1’ /etc/passwd

⑥awk ‘/2/,/2/’ a 第一个pattern匹配成功时为真, 第二个pattern匹配成功时为真.

 而模式范围匹配操作流程时:
if pattren1 is True:
  turned = "on" # 首先以pattern1匹配记录, 为真时, 将开关打开.

if turned == "on":  
   执行action # 然后逻辑内部再检测开关状态, 如果开关为打开状态, 就执行后面的动作

if pattren2 is True:
  turned == "off" #再以pattern2匹配记录, 为真时,将开关关闭
总结:对awk ‘/patten1/,/patten2/’双模匹配问题

1)patten1匹配 开关开,打印,patten2匹配 开关关,不打印
2)双模匹配是对一区间,匹配两次,区间有可能是一行,也有可能是多行,这个跟sed不同,sed是单行的匹配,匹配到/patten1/之后,/patten2/就不看了
1,2,3,4,5,6
7,8,9
10,11,12,13
22
hehe
1234
awk ‘/2/,/2/’ a
1,2,3,4,5,6 p1找到2为真,开关开,打印这行,p2找到2为真,开关关,不打印
7,8,9 这时开关为关,P1,p2都没有匹配,所以不打印 ==>这行不显示
10,11,12,13 p1找到2为真,开关开,打印这行,p2找到2为真,开关关,不打印
22 p1找到2为真,开关开,打印这行,p2找到2为真,开关关,不打印
hehe这时开关为关,P1,p2都没有匹配,所以不打印 ==》这行不显示
1234 p1找到2为真,开关开,打印这行,p2找到2为真,开关关,不打印

猜你喜欢

转载自blog.csdn.net/qq_28513801/article/details/83511408
今日推荐