我有一个文本文件,它列出了一个主机名,并在下面的行中说明了对 salt minion 的 ping 结果。这是一个示例输出:
T5F6Z12:
Minion did not return. [Not connected]
Run Code Online (Sandbox Code Playgroud)
我需要能够首先识别文本(Minion 没有返回)是否存在,如果存在,则获取与错误相关的主机名,以便我可以对该服务器运行其他命令。
我从这个开始:
if grep -q "Minion" /srv/salt/test/ping_results
then
Run Code Online (Sandbox Code Playgroud)
所以我很确定我需要对“Minion”这个词进行 grep,因为它只会出现在测试失败的服务器上。但是一旦我确定它存在,我不知道如何在文本文件中获取它上面的关联主机名。
您也可以使用-B1
打印前一行,然后只抓取第一行:
$ grep -B1 'Minion' ip.txt
T5F6Z12:
Minion did not return. [Not connected]
$ grep -B1 'Minion' ip.txt | head -n1
T5F6Z12:
Run Code Online (Sandbox Code Playgroud)
或者,这样做awk
:
$ awk '/Minion/{print p} {p=$0}' ip.txt
T5F6Z12:
$ awk '/Minion/{sub(/:$/, "", p); print p} {p=$0}' ip.txt
T5F6Z12
Run Code Online (Sandbox Code Playgroud)
这里p
一直保存最后一行。当输入行包含 时Minion
,它会被打印出来。请注意,这将适用于多个匹配项,这与grep
上面仅给出第一个匹配项的解决方案不同。