如何让 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}'
,它由两部分组成:
- 始终输出输入行的始终为真条件;
/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"'
看如何找到与模式匹配的文本?以获得其他匹配选项。