Chinaunix

标题: awk的模式问题,请大牛指点 [打印本页]

作者: 村里来的Linuxer    时间: 2016-06-26 23:55
标题: awk的模式问题,请大牛指点
本帖最后由 村里来的Linuxer 于 2016-09-20 22:40 编辑

文件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


作者: reyleon    时间: 2016-06-27 11:59
可以参考看看我之前发的贴:

http://bbs.chinaunix.net/thread-4246512-1-1.html
作者: reyleon    时间: 2016-06-27 12:15
本帖最后由 reyleon 于 2016-06-28 11:15 编辑



@blackold @关阴月飞 讨论与测试, 哥又涨姿势了, , 之前的编辑删了, 感觉全是错的

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

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


②awk '/2/,/2/0' a  第一个pattern匹配成功时为真, 第二个pattern永远为真.
③awk '/2/,/2/1' a  第一个pattern匹配成功时为真, 第二个pattern永远为真.
④awk '/2/,0' a  第一个pattern匹配成功时为真, 第二个pattern为数字0, 永远为假.
⑤awk '/2/,1' a 第一个pattern匹配成功时为真, 第二个pattern为数字1, 永远为真.
⑥awk '/2/,/2/' a  第一个pattern匹配成功时为真, 第二个pattern匹配成功时为真.


而模式范围匹配操作流程时:

if pattren1 is True:
  turned = "on" # 首先以pattern1匹配记录, 为真时, 将开关打开.

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

if pattren2 is True:
  turned == "off" #再以pattern2匹配记录, 为真时,将开关关闭






作者: blackold    时间: 2016-06-27 18:53
回复 1# 村里来的Linuxer


    这个问题有意思。真没注意过。
作者: blackold    时间: 2016-06-27 18:53
回复 3# reyleon


    学习了。
作者: blackold    时间: 2016-06-27 19:03
本帖最后由 blackold 于 2016-06-28 10:39 编辑

百度不了,只能 XXOO 了一番


之前的理解错了, 无论是作为独立的 pattern, 还是作为 range pattern 中的 pattern, 表达式 /pattern/0 (常量正则表达式进行字符串连接操作), 结果总当作字符串解释,永真。

  1. $ echo foo|awk '/1/'

  2. $ echo foo|awk '/1/""'
  3. foo

  4. $ echo foo|awk '/1/0'
  5. foo

复制代码
也许不同的版本的 awk 有不同的解释,就当作 XXOO 吧。

多谢 @关阴月飞 指正!
作者: jason680    时间: 2016-06-27 19:41
回复 1# 村里来的Linuxer

>>...给个说法

别乱用...(哪学的?)
   
作者: 村里来的Linuxer    时间: 2016-06-28 12:54
回复 3# reyleon

牛,学习了

   
作者: 村里来的Linuxer    时间: 2016-06-28 13:09
牛,学习了,求工作
回复 3# reyleon


   
作者: 18800375280    时间: 2016-06-30 20:35
流弊,学习了,求工作!
作者: songyc_2015    时间: 2016-06-30 23:11
流弊,又要涨姿势了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2