使用 /pat1/,/pat2/ 范围通常看起来是个好主意,但是一旦您需要添加条件或做其他事情,它就会变得平淡。恕我直言,你最好只使用这样的标志:
awk '/arg =>/{f=1} f; /bytes =>/{f=0}' file
因为可以在不完全重写的情况下进行扩展。在这种情况下,只需在您处于范围内时(即设置“f”时)建立一个记录,并在合适的情况下在范围末尾打印它。这将始终打印它:
awk '/arg =>/{rec=""; f=1} f{rec = rec $0 ORS} /bytes =>/{ if (f) printf "%s",rec; f=0}' file
并且只有当文本“whatever”出现在记录中时才会打印它:
awk '/arg =>/{rec=""; f=1} f{rec = rec $0 ORS} /bytes =>/{ if (f && (rec ~ "whatever")) printf "%s",rec; f=0}' file
并且只有当文本“whatever”没有出现在记录中时才会打印它:
awk '/arg =>/{rec=""; f=1} f{rec = rec $0 ORS} /bytes =>/{ if (f && (rec !~ "whatever")) printf "%s",rec; f=0}' file
这是您在下面评论中的脚本(稍微重新格式化)
<tcpdump> |
awk '
/arg =>/ {rec=""; f=1}
f {rec = rec $0 ORS}
/bytes =>/ {
if (rec !~ /menuStructure|session/)
printf "%s",rec
f=0
}
' | sed "s/.*bytes =>.*/\n----------\n/g" | sed "s/arg => //g"
基于此,我认为这个脚本会做你想做的事情:
<tcpdump> |
awk '
/bytes =>/ {
if (f && (rec !~ /menuStructure|session/))
print rec "----------"
f=0
}
f {rec = rec $0 ORS}
sub(/arg =>/,"") {rec=$0; f=1}
'