こんにちは。次の情報を含むテキストファイルがあります。
#[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
この正規表現は、単一のゼロ以外(またはゼロで始まらない)のすべて(正数)の数値をキャプチャする必要があります。