使用 awk 打印从匹配到文件末尾的行

Print lines from match until end of file with awk

Print lines in file from the match line until end of file中我了解到可以在awk中的范围表达式中使用0来匹配到文件末尾:

awk '/matched/,0' file

然而,今天我开始研究这个 0,我发现这也有效:

awk '/matched/,/!./' file

我猜 0 是有效的,因为在范围表达式 /regex1/,/regex2/ 中,行被打印直到 regex2 计算为 True。由于 0 的计算结果为 False,因此这永远不会发生,并且最终会打印所有行。这样对吗?

但是,对于 /!./,我想这会起作用,直到找到没有任何字符的行,就像我们说 awk '/matched/,!NF' 一样。但它没有:相反,它总是计算为 False。这是什么原因?

例子

$ cat a
1
matched
2

3
4
end

awk '/matched/,/!./' aawk '/matched/,0' a return:

matched
2

3
4
end

awk '/matched/,!NF' a returns:

匹配的
2个

你的感叹语用错地方了。像这样将它放在正则表达式之外以 否定匹配 :

awk '/matched/,!/./' a
matched
2


您的正则表达式 /!./ 匹配文字 ! 后跟任何字符。

如果你的文件是这样的:

cat a
1
matched
2

3
!4
end

然后

awk '/matched/,/!./' a
matched
2

3
!4

并且:

awk '/matched/,!/./' a
matched
2