Chinaunix
标题:
awk不解
[打印本页]
作者:
drakness
时间:
2015-11-10 12:32
标题:
awk不解
本帖最后由 drakness 于 2015-11-10 12:34 编辑
文本测试f.txt
test123 12
unix456 34
复制代码
t1=unix
awk -vs=$t1 's{print $2}' f.txt
复制代码
结果是:
12
34
复制代码
再继续看:
awk '/'$t1'/{print $2}' f.txt
复制代码
结果是:
34
复制代码
这句话问题出在哪儿了?
awk -vs=$t1 's{print $2}' f.txt
作者:
haooooaaa
时间:
2015-11-10 12:54
awk -vs=$t1 '$0~s{print $2}' a
34
awk '"unix"{print $2}' a
12
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
awk '1{print $2}' a
12
34
[root@test /tmp]$ awk '/1/{print $2}' a
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