
こんにちは。次の情報を含むテキスト ファイルがあります。
#[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
、変数をpr
1(true)に設定して、次の行に進みます。pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}
:pr
が true の場合、出力を希望の形式で印刷し、最後にpr
0 (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 で始まらない) 任意の (正の) 数値をキャッチする必要があります。