我有一个文本文件,其中列出了主机名,并在正下方的行中显示了 salt minion 的 ping 结果。这是一个示例输出:
T5F6Z12:
Minion did not return. [Not connected]
我需要能够首先识别文本(Minion 未返回)是否存在,如果存在,则获取与错误关联的主机名,以便我可以针对该服务器运行其他命令。
我是这样开始的:
if grep -q "Minion" /srv/salt/test/ping_results
then
所以我很确定我需要 grep 查找“Minion”这个词,因为它只会显示在测试失败的服务器上。但是,一旦我确定它存在,我不确定如何在文本文件中获取其上方的关联主机名。
答案1
您-B1
也可以使用打印上一行,然后仅获取第一行:
$ grep -B1 'Minion' ip.txt
T5F6Z12:
Minion did not return. [Not connected]
$ grep -B1 'Minion' ip.txt | head -n1
T5F6Z12:
或者,使用awk
:
$ awk '/Minion/{print p} {p=$0}' ip.txt
T5F6Z12:
$ awk '/Minion/{sub(/:$/, "", p); print p} {p=$0}' ip.txt
T5F6Z12
这里p
继续保存最后一行。当输入行包含 时Minion
,它将被打印。请注意,这适用于多个匹配,不像grep
上面的解决方案只提供第一个匹配。
答案2
如果你被束缚,grep
那么你可以保持多线比赛......
文件:
T5F6Z12:
Minion did not return. [Not connected]
T5F6Z11:
Pinion did return. [connected]
T5F6Z10:
Minion did not return. [Not connected]
使用
grep -B 1 "Minion" file | grep ":$"
T5F6Z12:
T5F6Z10:
如果你能使用sed
那就有答案在这里在 U&L 中,我在下面抄袭了
sed -n '/Minion/{x;p;d;}; x' file
T5F6Z12:
T5F6Z10: