![当输入没有结束时,如何在 awk 中使用 END {}?](https://linux22.com/image/161236/%E5%BD%93%E8%BE%93%E5%85%A5%E6%B2%A1%E6%9C%89%E7%BB%93%E6%9D%9F%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E5%9C%A8%20awk%20%E4%B8%AD%E4%BD%BF%E7%94%A8%20END%20%7B%7D%EF%BC%9F.png)
假设我正在使用一个命令,就像tail -f ./somefile
输入到我的awk
命令中一样。我想使用 awk 不断地对匹配项进行求和,几乎就像| wc -l
在命令末尾运行 a 一样,但是它将继续接收输入...当 AWK 对输入求和时,它会与END{}
命令的一部分一起显示它,但是由于它仍在接收输入,因此END{}
该命令的部分永远不会运行...那么我如何才能awk
继续接收来自tail -f ./somefile
命令的输入?是否有一个循环机制可以在awk
代码段中使用而不是使用END{}
?
答案1
您没有提到“匹配”到底是如何进行的,所以我假设匹配/pattern/ {}
规则的行会增加计数......
我想使用 不断地对匹配项进行求和
awk
,就像| wc -l
在命令末尾运行 a 一样
如果输入是无限的,我想您想在每次增加时显示计数?
END {}
基本上,在这种情况下不要使用规则;只需打印出您递增的计数器即可;就像这个 AWK 程序示例:
# Initializer
BEGIN {
counter=0;
}
# Pattern A
/^COUNT$/ {
++counter;
print counter;
}
# Pattern B
/^HERE$/ {
++counter;
print counter;
}
该程序将在输入中每次出现一行时进行计数(并显示计数器值)COUNT
。HERE
如果您有很多模式需要匹配并且希望最大限度地减少代码重复,您可以使用AWK函数将计数和显示合并为一项操作:
# Initializer
BEGIN { counter=0; }
# Count and Display Function
function count() {
++counter;
print counter;
}
# Pattern A
/^COUNT$/ { count(); }
# Pattern B
/^HERE$/ { count(); }
屏幕截图(上面的两个程序给出相同的输出):