如何使用 awk 从模式开始打印,以另一个模式结束然后退出?

how do I use awk to print starting at pattern, end at another pattern then exit?

我有一个格式如下的文本文件:

50000

55000

60000

65000

150000

160000

我想打印从 50000 开始到 60000 结束的所有内容。我尝试的是:

awk "/50000/,/60000/ {print}"

但这也会打印 150000 和 160000。我应该如何修改它?

目前,您在 150000 中获得 50000 的部分匹配,在 160000 中获得 60000 的部分匹配,并且您正在打印:

50000

55000

60000

150000

160000

如果你想匹配整行而不是部分匹配,你可以使用锚点作为开始和结束模式。

awk '/^50000$/,/^60000$/' file

awk 的最佳做法是不要使用 sed 样式的正则表达式范围。

相反,设置一个标志开始打印,另一个标志停止(也许退出)。

示例:

seq 100 | awk '
/^22$/{f=1}
/^29$/{exit}
f'

打印:

22
23
24
25
26
27
28

如果您没有匹配正则表达式,您可以将条件设​​置为等效

$ awk '[=10=]==50000,[=10=]==60000' file

会给你想要的范围。

此外,数字比较有效:

awk '50000 <=  &&  <= 60000' file

这里的print是隐含的。

您也可以采用 string-based 方法:

 gawk/nawk  '/^(5[0-9]{4}|6[0]{4})$/'

 mawk/mawk2 '/^(5[0-9][0-9][0-9][0-9]|60000)$/'

我建议不要使用 [[:digit:]] 代替 [0-9],因为 non-C/POSIX 区域设置可能会导致匹配 multi-byte“数字”,例如 Unicode 中的数字。

how do I use awk to print starting at pattern, end at another pattern then exit?

如果您只在第一个范围内感兴趣,那么在第一次出现结束模式时 exit,令 file.txt 内容为

50000
55000
60000
65000
150000
160000

然后

awk '/50000/,/60000/{print}/60000/{exit}' file.txt

输出

50000
55000
60000

请注意,此代码将在遇到第一个 /60000/ 时尽快结束处理,如果您的文件很大并且对靠近开始的第一个范围感兴趣,这将很有用。

(在 gawk 4.2.1 中测试)

你会做的稳健而高效:

awk '==50000{f=1} f{print; if (==60000) exit}' file

exit 所以 awk 不会在您要处理的最后一行之后很长时间内继续浪费时间读取输入。

以上假定如果输入中不存在 60000 但存在 50000,那么您希望打印从 50000 到文件末尾的行。如果不是这样的话:

awk '==50000{f=1} f{ buf=buf  ORS; if (==60000) {printf "%s", buf; exit} }' file