如何搜索特定单词并抓取文本

Sea*_*son 4 linux grep text

我有一个文本文件,它列出了一个主机名,并在下面的行中说明了对 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,因为它只会出现在测试失败的服务器上。但是一旦我确定它存在,我不知道如何在文本文件中获取它上面的关联主机名。

Sun*_*eep 8

您也可以使用-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上面仅给出第一个匹配项的解决方案不同。