在awk中,您可以针对给定的模式执行操作,例如:
echo foo | awk '/foo/ {print "foo"}'
或者您可以在输入末尾执行操作,例如:
echo foo | awk 'END {print "END"}'
但是似乎不可能同时做到这两个,例如:
# echo foo | awk '/foo/ || END {print "foo or END"}'
awk: syntax error at source line 1
context is
/foo/ || >>> END <<< {print "foo or END"}
awk: bailing out at source line 1
这可能吗?
答案 0 :(得分:6)
不。改为这样做:
\b
答案 1 :(得分:0)
您可以尝试此解决方法
awk '{Last=$0} END{ if( Last ~ /foo/) print "action if" }' YourFile
但仅用于最后一个文件的最后一行
答案 2 :(得分:0)
这可能更简单
$ awk '/foo/{exit} END{print "foo or END"}'
exit
将运行END
块,因此您无需重复该语句。
答案 3 :(得分:0)
不,您不能做这种事情。 END
语句在处理完最后一行后执行,与BEGIN
类似,它们是模式的特殊形式。
总体计划结构
awk程序由成对的 形式:
pattern { action }
pattern
或action
(包括括号在内) 字符)可以省略。模式
模式是任何有效的表达式,范围是由两个表达式之间用逗号分隔的,是两个特殊模式
BEGIN
或END
之一。特殊模式
awk实用程序应识别两个特殊模式
BEGIN
和END
。每个BEGIN
模式应匹配一次,并在读取输入的第一条记录之前执行其关联的动作-除非可能在先前的{中使用getline
函数(请参见输入/输出和通用函数) {1}}操作-在完成命令行分配之前。每个BEGIN
模式应匹配一次,并在读取最后一条输入记录后执行其关联的动作。这两种模式应具有关联的动作。
END
和BEGIN
不得与其他模式组合。允许使用多个END
和BEGIN
模式。与END
模式相关联的动作应按照程序中指定的顺序执行,就像BEGIN
动作一样。在程序中,END
模式可以在END
模式之前。
声明
BEGIN
因此不允许使用,因为它将/foo/ || END { action }
与另一个模式结合在一起。
有关优雅的解决方案,请参见Ed Morton的答案。