我有一个脚本问题。我有一个shell命令,产生下面的输出。请注意,只有一个,但实际上有很多结果。
NAME | xpr : SEVERITY
| xxpr : 000
| clavv :
| clfic :
| name :
| domain : V
| azzl : U_
| utt : WFH
| info :
| sev : 0005
所以,我的目标是在NAME的线上grep以获得它的实际名称,即SEVERITY。但是,如果“sev”行有0005,我只想打印它。如果没有,请不要打印名称。任何指导将不胜感激。
谢谢
以下命令在假设NAME
和sev
属性之间总共有十行的情况下工作。
yourCommand | grep -B10 -Ew 'sev *: *0005' | grep -Pow 'NAME *\| *xpr *: *\K.*'
第一部分提取以sev : 0005
结尾的十行块。第二部分从这些块中提取名称(在您的示例中为SEVERITY
)。
这将在Bash中有效:
[[ ! -z " $( grep -E 'sev *: *0005' test.txt ) " ]] && grep -E '^NAME' test.txt | awk -F':' '{ print $2}'
问候!
如果'NAME'和'sev'之间的距离没有固定,你必须要两次grep
a=$(yours_shell_command); echo "$a" | grep -q 'sev *: 0005' && echo "$a" | grep 'NAME' | sed 's/.*: //'