当输入没有结束时,如何在 awk 中使用 END {}?

当输入没有结束时,如何在 awk 中使用 END {}?

假设我正在使用一个命令,就像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;
}

该程序将在输入中每次出现一行时进行计数(并显示计数器值)COUNTHERE

如果您有很多模式需要匹配并且希望最大限度地减少代码重复,您可以使用AWK函数将计数和显示合并为一项操作:

# Initializer
BEGIN { counter=0; }

# Count and Display Function
function count() {
    ++counter;
    print counter;
}

# Pattern A
/^COUNT$/ { count(); }

# Pattern B
/^HERE$/ { count(); }

屏幕截图(上面的两个程序给出相同的输出):

相关内容