awk if 循环或不工作

awk if 循环或不工作

我正在尝试解析下面的源文件。我正在尝试提取 ===== 和 ENDTIME 之间的文本。我在下面的单独块中使用代码。但是当我使用||时过滤多个模式是行不通的。但是,当我在 awk if 块中使用单一模式时,它能够过滤。有人可以让我知道该命令有什么问题吗?为什么 or 块不起作用?

源文件:

STARTTIME --- 2019/09/19 12:00:44
==================================================================
Processname                                Node   Status   QueueAv
==================================================================
RtpNm01                                   CE_01      run      full
RtpAcp01                                  CE_01      run      full
RtpDynManLite01                           CE_01      run      full
RtpDynLiteInc01                           CE_01      run      full
ENDTIME --- 2019/09/19 12:00:45
Expected Result:
RtpNm01                                   CE_01      run      full
RtpAcp01                                  CE_01      run      full
RtpDynManLite01                           CE_01      run      full
RtpDynLiteInc01                           CE_01      run      full

代码:

cat rtpServiceStatusrun | awk '/Processname\s*Node\s*Status\s*QueueAv/{
while (getline){
        if( $0 !~ /^====*/ || $0 !~ /^ENDTIME*/ ){
                        print $0
                }
        }
}'

答案1

许多做到这一点的方法,包括:

$ awk '/^ENDTIME/ {next}; NR>4' sourcefile 
RtpNm01                                   CE_01      run      full
RtpAcp01                                  CE_01      run      full
RtpDynManLite01                           CE_01      run      full
RtpDynLiteInc01                           CE_01      run      full

这会打印所有输入行第四行,除了任何以 开头的行ENDTIME

我认为这就是您试图对块while (getline)中的奇怪循环执行的操作/Processname\s*....../- 没有必要这样做,awk 已经循环了每一行输入,并且您可以测试 NR 的值(当前输入行号)。

和:

awk '! /^(STARTTIME|ENDTIME|=====|Processname)/' sourcefile

grep -vE '^(STARTTIME|ENDTIME|=====|Processname)' sourcefile

sed -E -e '/^(STARTTIME|ENDTIME|=====|Processname)/d' sourcefile

所有这些都打印任何行不是匹配正则表达式。它们都使用相同的扩展正则表达式(ERE - 默认为awk,对于和-E都启用)来查找行开头的任何替换(以 锚定)。grepsed^

和:

sed -e '1,4d; $d' sourcefile

删除第一行到第四行以及最后一行。

答案2

一种选择:

cat file | head -n -1 | tail -n +5

答案3

我将 or (||) 更改为添加 (&&),它开始工作。

cat rtpServiceStatusrun | awk '/Processname\s*Node\s*Status\s*QueueAv/{
while (getline){
        if( $0 !~ /^====*/ && $0 !~ /^ENDTIME*/ ){
                        print $0
                }
        }
}'

相关内容