如何 grep 查找特定单词并抓取文本

如何 grep 查找特定单词并抓取文本

我有一个文本文件,其中列出了主机名,并在正下方的行中显示了 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:

相关内容