文字列値が 0 より大きい場合、前の行を Grep します。

文字列値が 0 より大きい場合、前の行を Grep します。

こんにちは。次の情報を含むテキストファイルがあります。

#[Tue Oct 25 00:00:02 2016] --- START OUTPUT
#CMD: XXX
END-->0<--
#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55

#[Tue Oct 25 00:05:01 2016] --- START OUTPUT
#CMD: XXX
END-->0<--
#[Tue Oct 25 00:05:33 2016] --- END
#RETURN: 0
#ELAPSED TIME (in seconds): 32

そのReturnが0の場合は、--EndReturnと行を取得したいと思います。 Elapsed>

これまではReturnラインだけをgrepできます。grep "#RETURN:" -A 1 -B 1 f.log

>しかし、Returnが0の場合にのみgrepする方法は何ですか?

希望の出力:

#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55

ベストアンサー1

そしてawk

awk '/END$/ {prev=$0; next}; /^#RETURN/ && $2>0 {cur=$0; pr=1; next};\
                      pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}' file.txt
  • /END$/ {prev=$0; next}:行が終わったら、END変数として保存prevし、前の行である次の行に移動します。RETURN

  • /^#RETURN/ && $2>0 {cur=$0; pr=1; next}:行がで始まり#RETURN、2番目のフィールドが0より大きい場合は、行をとして保存し、cur変数をpr1(true)に設定してから次の行に移動します。

  • pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}prtrueの場合は、出力を希望の形式で印刷し、最後にpr0(false)に設定します。

例:

% cat file.txt                                                                                                                   
#[Tue Oct 25 00:00:02 2016] --- START OUTPUT
#CMD: XXX
END-->0<--
#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55

#[Tue Oct 25 00:05:01 2016] --- START OUTPUT
#CMD: XXX
END-->0<--
#[Tue Oct 25 00:05:33 2016] --- END
#RETURN: 0
#ELAPSED TIME (in seconds): 32

% awk '/END$/ {prev=$0; next}; /^#RETURN/ && $2>0 {cur=$0; pr=1; next}; pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}' file.txt
#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55

おすすめ記事