在有限的 shell 环境中从多行 Grep 输出

在有限的 shell 环境中从多行 Grep 输出

我一直在网上搜索搜索多行输出的方法,然后打印包含我关心的字符串的行。我实际上是在检查点防火墙上运行这个命令,命令如下:cphaprob -ia list 当我执行该命令时,我得到了多行输出。(如下)。我试图做的是 grep、sed 或 pcregrep 命令的输出以仅返回某些部分。我的想法是,我可以使用 awk 导出位置“x”的值,然后使用变量打印我自己的 echo 命令。但我必须先只获取我关心的行。我想打印显示设备名称和“状态”的行。我更愿意在线执行此操作,而不是将值输出到文件并对其运行命令。类似于

cphaprob -ia 列表 | grep 名称 | grep 状态

我知道上面的示例由于各种原因无法正常工作,但它表达了我想要做的事情。我希望 shell 以良好的格式打印以下内容:

设备名称:x
当前状态:y

仅此而已。有些行上有一些即兴的词语,例如超时和自上次报告以来的时间,我不想显示这些词语。

我不能使用 Perl。

有人有建议吗?

PS,下面的输出实际上在不同的行上,但我无法让此网站上的输出将其显示为单独的行。例如,设备名称:问题通知当前状态:OK 实际上是两行。当前状态是下一行。其余输出也是如此。

[Expert@firewall:0]# cphaprob -ia list

Built-in Devices:

Device Name: Problem Notification
Current state: OK

Device Name: Interface Active Check
Current state: OK

Device Name: HA Initialization
Current state: OK

Device Name: Load Balancing Configuration
Current state: OK

Device Name: Recovery Delay
Current state: OK

Registered Devices:

Device Name: Synchronization
Registration number: 0
Timeout: none
Current state: OK
Time since last report: 60485.9 sec

Device Name: Filter
Registration number: 1
Timeout: none
Current state: OK
Time since last report: 60484.8 sec

Device Name: cphad
Registration number: 2
Timeout: none
Current state: OK
Time since last report: 437745 sec

Device Name: fwd
Registration number: 3
Timeout: none
Current state: OK
Time since last report: 2.76118e+06 sec

Device Name: routed
Registration number: 4
Timeout: none
Current state: OK
Time since last report: 60478.4 sec

答案1

cphaprob -ia list | grep -e "Name:" -e "state:"

会做。

答案2

这可能会起作用,但根据你的输出,它可能会给你一些你不想要的额外匹配(例如,它也会匹配单词 same 和 status)

cphaprob -ia list | grep "[Ns][at][ma][et]e\?"

我不确定你的意思是什么:

有些行上有一些即兴的词语,例如超时和自上次报告以来的时间,我不想显示这些词语。

如果您指的是有些行包含您不想要的其他信息,那么上面的方法应该可以帮您清除这些信息。如果您指的是设备名称或当前状态的同一行中有时会包含额外信息,而您不想显示这些信息,则需要进行额外的格式化。

相关内容