文字列の値が 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 の場合、行と行を--End取得Returnします。 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}:prが true の場合、出力を希望の形式で印刷し、最後に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

答え2

これを試すことができます。

awk -F: '/#RETURN:/ && $2 > 0 { getline; print $0}' test

例えば;

user@host:/tmp$ awk -F: '/#RETURN:/ && $2 > 0 { getline; print $0}' test
#ELAPSED TIME (in seconds): 55

答え3

以下の場合には正規表現を使用する必要がありますgrep

 grep -C1 'RETURN: [1-9][0-9]*' input.txt

この正規表現は、単一の 0 ではない (または 0 で始まらない) 任意の (正の) 数値をキャッチする必要があります。

関連情報