使用 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/,/!./' a
和 awk '/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
在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/,/!./' a
和 awk '/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