Chinaunix

标题: awk不解 [打印本页]

作者: drakness    时间: 2015-11-10 12:32
标题: awk不解
本帖最后由 drakness 于 2015-11-10 12:34 编辑

文本测试f.txt
  1. test123 12
  2. unix456 34                    
复制代码
  1. t1=unix
  2. awk -vs=$t1 's{print $2}' f.txt
复制代码
结果是:
  1. 12
  2. 34
复制代码
再继续看:
  1. awk '/'$t1'/{print $2}' f.txt
复制代码
结果是:
  1. 34
复制代码
这句话问题出在哪儿了?awk -vs=$t1 's{print $2}' f.txt
作者: haooooaaa    时间: 2015-11-10 12:54
  1. awk -vs=$t1 '$0~s{print $2}' a
  2. 34
  3. awk '"unix"{print $2}' a
  4. 12
  5. 34
复制代码

作者: blackold    时间: 2015-11-10 12:59
回复 1# drakness


    一个是变量表达式pattern, 一个正则表达式pattern。
作者: drakness    时间: 2015-11-10 13:00
回复 2# haooooaaa


    印象中,这么用是可以的,今天再试,发现是错误的,搞不懂啊
作者: drakness    时间: 2015-11-10 13:04
回复 3# blackold


黑哥,这个我不明白的,if(xx ~ s) 可以,而这个s{xx}却不行,能再多说几句吗?

作者: drakness    时间: 2015-11-10 13:06
回复 5# drakness


    s算是个变量pattern了吧,为何if(xx ~ s)可以,而s{xx}不行?
作者: haooooaaa    时间: 2015-11-10 13:25
回复 6# drakness
  1. awk '1{print $2}' a
  2. 12
  3. 34
  4. [root@test /tmp]$ awk '/1/{print $2}' a
  5. 12
复制代码

作者: drakness    时间: 2015-11-10 13:32
本帖最后由 drakness 于 2015-11-10 13:33 编辑

回复 7# haooooaaa


    if(xxx ~ s) 中的s格式是/xxx/这样的吧?
这就是我最不明白的地方了

作者: drakness    时间: 2015-11-10 13:46
回复 2# haooooaaa


    谢谢大神了,我再慢慢体会体会
作者: reyleon    时间: 2015-11-10 14:26
模式分很多种.

1. 正则表达式
2. 普通表达式, 如常量表达式, 比较表达式
3. 模式范围
4. BEGIN/END 等特殊模式
5. 空模式

正则表达式模式使用 // 囊括起来, 如你提到的这种 awk '/'$t1'/{print $2}' , 还有这种 $0~s, 而这种是正则表达式中的动态正则表达式模式. 你的, 懂?
普通表达式, 如 一个数字, 一个字符串等等 都可以作为awk的一个模式, 凡是数字非0,字符串非空 都认为这个模式为真. 's{print $2}' 就是这样的一个字符串模式. s是非空的, 所以这个模式永远是真



作者: reyleon    时间: 2015-11-10 14:33
再多说一句, 在正则表达式模式中, 如果是以 $0 匹配 正则表达式, 那么 $0 是可以省略的,  '$0~/xxoo/ { print }'  可以直接成为 ' /xxoo/ { print }' , 但是, 在动态的正则表达式中, 不能省略 $0 云云...
作者: drakness    时间: 2015-11-10 14:51
回复 10# reyleon


    我的,明白了
作者: blackold    时间: 2015-11-10 20:05
回复 5# drakness


    xx ~ s 表示把 s 当作正则表达式,而 s{...} 把 s 当作普通表达式。
详见 @reyleon的解释。
   




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