需要awk变量赋值语句解释

Ken*_*ent 5 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"
Run Code Online (Sandbox Code Playgroud)

我得到了这个输出:

$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
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我得到这个输出.我以为awk会抱怨任务声明,但它没有......似乎awk正在进行奇怪的正则表达式匹配检查我做了$0=/xxx/什么?就是$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
Run Code Online (Sandbox Code Playgroud)

所以看来,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)
Run Code Online (Sandbox Code Playgroud)

如果有人能解释我,我很感激.提前致谢.

编辑

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

kent$  echo "xx"|awk '{if(/x/)print "ok"}'                                                                                                                                  
ok
Run Code Online (Sandbox Code Playgroud)

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

Ed *_*ton 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中重复ZERO或更多次的文字,其中有零,因此结果为1.

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