/pat1/,/pat2/ の範囲を使用することは、通常は良い考えのように思えますが、条件を追加するか、何か他のことを行う必要があるとすぐに、うまくいきません。IMHO、次のようなフラグを使用する方がよいでしょう:
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}
'