awk 边界是模式的开始

awk 边界是模式的开始


如何让 awk 设置尝试模式的开头范围或边界1失败为

$ echo -e 'a\nb\nc\nend\ne\nf\ng\n' |awk '1,/end/ {print $0}'
a
b
c
end
e
f
g

这适用于所有人,因为模式有效:

$ echo -e 'a\nb\nc\nend\ne\nf\ng\n' |awk '/b/,/end/ {print $0}'
b
c
end

但回到问题如何获得模式开始的范围或边界?

答案1

如果您想要第 2 行和第 4 行之间的线,则可以执行以下操作。

awk 'NR ==2, NR == 4' file

如果您的目的是获取regex1和之间的行regex2,那么您可以将 NR 表达式替换为正则表达式:

awk '/regex1/, /regex2/' file

更详细的形式是:

awk '$0 ~ /regex1/, $0 ~ /regex2/ { print $0}' file

作为其他答案建议全行字符串匹配上面的表达式来自该命令。这个答案读起来很引人注目。

awk '$0 == "b", $0 == "end" { print $0}' file

awk '/b/, /end/' file为了你想要得到的东西。

现在您可以将这两件事结合起来,即保留一个 NR 表达式和一个正则表达式。

awk '/b/, NR == 4' file

或者

awk 'NR == 2, /end/' file

echo -e 'a\nb\nc\nend\ne\nf\ng\n' |awk '1,/end/ {print $0}' 在此命令中,我们应该告诉awk它应该在第 1 行时开始(当记录数为 1 时,即 NR ==1);

这是:

echo -e 'a\nb\nc\nend\ne\nf\ng\n' |awk 'NR == 1,/end/ {print $0}'

这会起作用。

答案2

那是:

awk 'NR==1, /end/'

意味着从文件的开头(从第一行开始)打印到包含模式的行end。注意{print $0}(或缩写print)在这里是可选的。

你的命令有问题吗?

with awk '1,/end/{ print $0 }',实际上就是这个命令awk '1 || /end/ {print $0}',它由两部分组成:

  1. 始终输出输入行的始终为真条件;
  2. /end/正则表达式仅打印与模式匹配的行end当存在比此优先级更高的条件时,这是多余的。该命令实际上可以缩短为awk 1(如上所述{ print $0 }是可选的)。

...这导致所有线路都输出。


如果起始点总是第一行,也可以这样写,一旦出现就立即退出end找到模式以避免不必要地读取文件的其余部分。

awk '/end/{ print; exit }1'   ##or
awk '{ print } /end/{ exit }' ##or
awk '1; /end/{ exit }'

并从打印中排除图案本身:

awk '/end/{ exit } { print }' ##or
awk '/end/{ exit }1'

做同样的事情,但将模式匹配为细绳您可以执行以下操作,而不是使用正则表达式和全行字符串匹配:

awk 'NR==1, $0=="end"'

如何找到与模式匹配的文本?以获得其他匹配选项。

相关内容