如何保持第一个参数并根据是否满足其他参数进行打印?

问题描述 投票:0回答:3

我有一个脚本问题。我有一个shell命令,产生下面的输出。请注意,只有一个,但实际上有很多结果。

NAME   | xpr          : SEVERITY
       | xxpr         : 000
       | clavv        :
       | clfic        :
       | name         :
       | domain       : V
       | azzl         : U_
       | utt          : WFH
       | info         :
       | sev          : 0005

所以,我的目标是在NAME的线上grep以获得它的实际名称,即SEVERITY。但是,如果“sev”行有0005,我只想打印它。如果没有,请不要打印名称。任何指导将不胜感激。

谢谢

bash shell
3个回答
2
投票

以下命令在假设NAMEsev属性之间总共有十行的情况下工作。

yourCommand | grep -B10 -Ew 'sev *: *0005' | grep -Pow 'NAME *\| *xpr *: *\K.*'

第一部分提取以sev : 0005结尾的十行块。第二部分从这些块中提取名称(在您的示例中为SEVERITY)。


1
投票

这将在Bash中有效:

[[ ! -z " $( grep -E 'sev *: *0005' test.txt ) "   ]] && grep -E '^NAME' test.txt | awk -F':' '{ print $2}'

问候!


1
投票

如果'NAME'和'sev'之间的距离没有固定,你必须要两次grep

a=$(yours_shell_command); echo "$a" | grep -q 'sev *: 0005' && echo "$a" | grep 'NAME' | sed 's/.*: //'
© www.soinside.com 2019 - 2024. All rights reserved.