我正在尝试解析下面的源文件。我正在尝试提取 ===== 和 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
都启用)来查找行开头的任何替换(以 锚定)。grep
sed
^
和:
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
}
}
}'