当我运行awk
具有语法的命令时NR== /regex/
,它会给出意外的结果。文件内容:
cat file
## This is
## a
## b
## c
## end
## e
## f
## g
现在我在文件开头添加一个空行。
sed '1 s.^.\n.' file >file2
我添加另一行,如下所示:
sed '1 s.^.user288752 is back\n.' file2 >file3
现在我对三个文件运行以下命令:
awk 'NR== /is/, /end/' file
## This is
## a
## b
## c
## end
awk 'NR== /is/, /end/' file2
在 file2 中awk
没有匹配任何内容。
awk 'NR== /is/, /end/' file3
## user288752 is back
##
## This is
## a
## b
## c
## end
在我看来,is
只有当它出现在第 1 行时才匹配。但我没有$0 ~ /is/
在这个命令中写入。并且is
不等于NR。我知道is
在这种情况下是 regex( /is/
) 但为什么is
要匹配 NR?我缺少什么?
答案1
我们来看一下NR == /is/
。
这可以重写为NR == ( /is/ )
,这是两个布尔测试:
/is/
is
,如果该字符串存在于当前记录(行)中,则为 true 。NR == something
,如果我们位于输入行 ,则这是正确的something
。
在该awk
语言中,值为真的是 1,所以如果/is/
是真的/is/
,它将为 1。包含字符串 的每一行上的表达式将为 1 is
。第一个文件位于is
第一行,第二个文件位于is
第 2 行,第三个文件位于is
第 1 行和第 3 行。
$ awk '{ printf "NR: %d\t/is/: %d\n", NR, /is/ }' file1
NR: 1 /is/: 1
NR: 2 /is/: 0
NR: 3 /is/: 0
NR: 4 /is/: 0
NR: 5 /is/: 0
NR: 6 /is/: 0
NR: 7 /is/: 0
NR: 8 /is/: 0
$ awk '{ printf "NR: %d\t/is/: %d\n", NR, /is/ }' file2
NR: 1 /is/: 0
NR: 2 /is/: 1
NR: 3 /is/: 0
NR: 4 /is/: 0
NR: 5 /is/: 0
NR: 6 /is/: 0
NR: 7 /is/: 0
NR: 8 /is/: 0
NR: 9 /is/: 0
$ awk '{ printf "NR: %d\t/is/: %d\n", NR, /is/ }' file3
NR: 1 /is/: 1
NR: 2 /is/: 0
NR: 3 /is/: 1
NR: 4 /is/: 0
NR: 5 /is/: 0
NR: 6 /is/: 0
NR: 7 /is/: 0
NR: 8 /is/: 0
NR: 9 /is/: 0
NR: 10 /is/: 0
我们现在知道/is/
在某些行上它是 1。这意味着NR == /is/
测试将是真的if/is/
与 is 1 同时为NR
1,它只能位于输入的第一行(如果有的话),因为对NR
输入行进行计数。
在您的三个文件中,第一个和最后一个满足此条件,而第二个则不满足。