您好,我有一个包含以下信息的文本文件:
#[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
Run Code Online (Sandbox Code Playgroud)
如果对应的返回值为0,我想获取该--End行Return和该Elapsed行>。
到目前为止,我刚刚能够 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
Run Code Online (Sandbox Code Playgroud)
与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
Run Code Online (Sandbox Code Playgroud)
/END$/ {prev=$0; next}: 如果该行以 结尾END,则将其保存为变量prev,并转到下一行;这是之前的线路RETURN
/^#RETURN/ && $2>0 {cur=$0; pr=1; next}: 如果该行开头#RETURN且第二个字段大于0,则将该行另存为cur,将变量设置pr为1(真),然后转到下一行
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
Run Code Online (Sandbox Code Playgroud)