gawk:为什么 "next;" 不抑制与模式匹配的行?
gawk: why doesn't "next;" suppress lines matching a pattern?
我有以下 awk 程序:
/.*needle.*/
{
if ([=11=] != "hay needle hay")
{
print "yay: ", ;
next;
}
print "ya2";
next;
}
{
print "no";
next;
}
我 运行 它作为 gawk -f test.awk < some.log > out.log
在 GNU Awk 4.2.1, API: 2.0
.
some.log:
hay hay hay
hay needle hay
needle
hay hay
hay
hay
out.log:
yay: hay
hay needle hay
ya2
needle
yay: needle
yay: hay
yay: hay
yay: hay
我希望它只打印 "ya2-new line-yay: needle"。
这引发了问题:
- 为什么即使在非匹配行上也会调用模式操作,而不是无条件操作?
The purpose of the action is to tell awk what to do once a match for the pattern is found
.
- 为什么
next;
不抑制匹配行的打印,因为 print
is only the "default" action? We have a non-default action here. The next statement forces awk to immediately stop processing the current record and go on to the next record
- 我可以并且确实在默认操作中将
match()
调用放入 if()
中,但为什么这个变体不起作用?
您似乎是 Allman indentation style 的粉丝。我假设 if ([=13=] != ...
块只应该 运行 在记录匹配 needle
的地方——你需要将左大括号放在与模式相同的行上。
/.*needle.*/ {
if ([=10=] != "hay needle hay")
{
print "yay: ", ;
next;
}
print "ya2";
next;
}
输出:
no
ya2
yay: needle
no
no
no
在 awk 中,换行符是一个终止符,就像分号一样。
你现在拥有的是:
# if the line matches "needle", print it verbatim
/.*needle.*/
# And **also**, for every line, do this:
{
if ([=12=] != "hay needle hay")
{
print "yay: ", ;
next;
}
print "ya2";
next;
}
我有以下 awk 程序:
/.*needle.*/
{
if ([=11=] != "hay needle hay")
{
print "yay: ", ;
next;
}
print "ya2";
next;
}
{
print "no";
next;
}
我 运行 它作为 gawk -f test.awk < some.log > out.log
在 GNU Awk 4.2.1, API: 2.0
.
some.log:
hay hay hay
hay needle hay
needle
hay hay
hay
hay
out.log:
yay: hay
hay needle hay
ya2
needle
yay: needle
yay: hay
yay: hay
yay: hay
我希望它只打印 "ya2-new line-yay: needle"。
这引发了问题:
- 为什么即使在非匹配行上也会调用模式操作,而不是无条件操作?
The purpose of the action is to tell awk what to do once a match for the pattern is found
. - 为什么
next;
不抑制匹配行的打印,因为print
is only the "default" action? We have a non-default action here.The next statement forces awk to immediately stop processing the current record and go on to the next record
- 我可以并且确实在默认操作中将
match()
调用放入if()
中,但为什么这个变体不起作用?
您似乎是 Allman indentation style 的粉丝。我假设 if ([=13=] != ...
块只应该 运行 在记录匹配 needle
的地方——你需要将左大括号放在与模式相同的行上。
/.*needle.*/ {
if ([=10=] != "hay needle hay")
{
print "yay: ", ;
next;
}
print "ya2";
next;
}
输出:
no
ya2
yay: needle
no
no
no
在 awk 中,换行符是一个终止符,就像分号一样。
你现在拥有的是:
# if the line matches "needle", print it verbatim
/.*needle.*/
# And **also**, for every line, do this:
{
if ([=12=] != "hay needle hay")
{
print "yay: ", ;
next;
}
print "ya2";
next;
}