我们将有这样一个场景:检查集群的状态,如果发现任何问题,我们希望获取输出的 3 个属性并将信息发送到事件管理系统。
这是输出:
Name : host1.domain.com
Address : 10.10.10.1
Overall Health : DISK_ERROR
--
Name : host2.domain.com
Address : 10.10.10.2
Overall Health : MEMORY_ERROR
--
Name : host3.domain.com
Address : 10.10.10.3
Overall Health : HEALTH_GOOD
--
我希望做的是获取每一行,获取冒号右侧的值并将每个值分配给一个变量,然后将其传递到事件“消息”中。然后,当脚本到达破折号(或我可以设置的其他分隔符)时,重新开始并创建另一个事件“消息”,并对整个失败的集群成员重复此操作。
在我看来,这将是一个 for 或 while 循环,但不确定应该如何构建。最终结果看起来像这样:
var1=host1.domain.com var2=10.10.10.1 var3=DISK_ERROR
message -remote_host -port -msg "The host $var1 at IP $var2 is experiencing an issue of a $var3"
过去一周我进行了大量搜索,但没有看到这样的例子。似乎循环遍历列表是一回事,基于分隔符结束列表是类似的,但我还没有看到一个可用的示例,在该示例中,您从输出创建多个变量,将它们添加到回显或某种类型的外部操作中,然后然后重新开始,使用同一输出中的另一组数据再次创建相同的场景。我可以看到为每个文件写入一个文件,然后处理每个文件(如果这有意义的话),但此时我不确定如何有效地完成我所要求的任务。这可能是不可能的,但我们非常感谢任何有关操作数据的最佳方法的建议。
答案1
在 awk 中快速实现:
awk -F ' *: *' '$1 ~ /Name/ { n = $2 } $1 ~ /Address/ { a = $2 } $1 ~ /Overall Health/ { m = $2 } /^--$/ {printf "The host %s at IP %s is experiencing an issue of a %s\n", n, a, m}'
可以通过管道将命令传递给此命令,或者如果您想从文件中读取数据,请将文件名放在命令末尾。 (如所写,它将等待来自标准输入的输入。)