需要awk变量赋值语句解释

时间:2013-09-13 21:18:00

标签: awk gawk

好的,直截了当,这是代码,我将代码格式化了一点,以便于阅读:

awk '{
t=$0   ; 
$0=t   ; $0=//           ; print "$0=//           ; value of $0 is ",$0
$0=t   ; $0=/./          ; print "$0=/./          ; value of $0 is ",$0
$0=t   ; $0=/*/          ; print "$0=/*/          ; value of $0 is ",$0
$0=t   ; $0=/**/         ; print "$0=/**/         ; value of $0 is ",$0
$0=t   ; $0=/[0-9]/      ; print "$0=/[0-9]/      ; value of $0 is ",$0
$0=t   ; $0=/[a-z]/      ; print "$0=/[a-z]/      ; value of $0 is ",$0
$0=t   ; $0=/[0-9][a-z]/ ; print "$0=/[0-9][a-z]/ ; value of $0 is ",$0
$0=t   ; $0=/5/          ; print "$0=/5/          ; value of $0 is ",$0
$0=t   ; $0=/55/         ; print "$0=/55/         ; value of $0 is ",$0
$0=t   ; $0=/x/          ; print "$0=/x/          ; value of $0 is ",$0
$0=t   ; $0=/5x/         ; print "$0=/5x/         ; value of $0 is ",$0
$0=t   ; $0=/x5/         ; print "$0=/x5/         ; value of $0 is ",$0
$0=t   ; $0=/xoo/        ; print "$0=/xoo/        ; value of $0 is ",$0
$0=t   ; $0=/500/        ; print "$0=/500/        ; value of $0 is ",$0
}'<<<"5x"

我得到了这个输出:

$0=//           ; value of $0 is  1
$0=/./          ; value of $0 is  1
$0=/*/          ; value of $0 is  0
$0=/**/         ; value of $0 is  1
$0=/[0-9]/      ; value of $0 is  1
$0=/[a-z]/      ; value of $0 is  1
$0=/[0-9][a-z]/ ; value of $0 is  1
$0=/5/          ; value of $0 is  1
$0=/55/         ; value of $0 is  0
$0=/x/          ; value of $0 is  1
$0=/5x/         ; value of $0 is  1
$0=/x5/         ; value of $0 is  0
$0=/xoo/        ; value of $0 is  0
$0=/500/        ; value of $0 is  0

我无法理解为什么我得到这个输出。我以为awk会抱怨任务声明,但它没有...当我做$0=/xxx/时,似乎awk正在进行奇怪的正则表达式匹配检查?也就是说,$0=/pattern/$0=$0~/pattern/相同?

然后我做了这个测试:

kent$  echo "xx"|awk '{y="777";y=/x/;print y}'                                                                                                                              
1

kent$  echo "xx"|awk '{y="777";y=/7/;print y}'                                                                                                                              
0

看来,foo=/pattern/foo=$0~/pattern/

相同

但我不确定...无法在文档/手册页中找到信息。

当我在这里回答一个awk问题时,我发现了这个问题。

我用我的awk测试了:

kent$  awk --version|head -1
GNU Awk 4.1.0, API: 1.0 (GNU MPFR 3.1.2, GNU MP 5.1.2)

如果有人能解释我,我感激不尽。提前谢谢。

修改

经过更多的测试后,结果是(再次,不确定,因为我没有在文档中找到它), {...}内,仅/pattern/就是$0~/pattern/的缩写形式与{...}之外的缩写形式相同,如/patter/{do something}。所以我们可以这样做:

kent$  echo "xx"|awk '{if(/x/)print "ok"}'                                                                                                                                  
ok

我不知道它是否是awk脚本语法的标准功能。如果它适用于所有awk实现。我仍在搜索手册和手册页......

2 个答案:

答案 0 :(得分:6)

/regexp/只是$0 ~ /regexp/

的简写

var = ($0 ~ /regexp/)指定var的比较结果,1表示true,否则为0。

$0 = ($0 ~ /regexp/)为$ 0和/ regexp /

的比较结果分配$ 0

$0 = ($0 ~ //)为$ 0分配$ 0的结果,总是有,所以条件为真所以结果为1

$0 = //执行相同的操作

$0 = /*/正在寻找$ 0中的文字*,但结果不是零。

$0 = /**/正在寻找文字*重复零次或多次0美元,其中只有0,因此结果是1.

没有神秘感,没有什么奇怪的......

答案 1 :(得分:2)

这里没有谜,你只是将$0的值设置为评估的正则表达式匹配的值。首先评估右侧,如果该行与正则表达式匹配,则结果为True ,即。 1 ,否则结果为False ,即。 0 的。