Ich habe eine Textdatei, die einen Hostnamen auflistet und in der Zeile direkt darunter die Ergebnisse eines Pings eines Salt Minion angibt. Hier ist eine Beispielausgabe:
T5F6Z12:
Minion did not return. [Not connected]
Ich muss zuerst feststellen können, ob der Text (Minion did not return) existiert, und wenn ja, den mit dem Fehler verknüpften Hostnamen abrufen, damit ich andere Befehle für diesen Server ausführen kann.
Ich habe damit begonnen:
if grep -q "Minion" /srv/salt/test/ping_results
then
Ich bin mir also ziemlich sicher, dass ich nach dem Wort „Minion“ suchen muss, da es nur für Server angezeigt wird, die den Test nicht bestanden haben. Aber nachdem ich festgestellt habe, dass es existiert, bin ich mir nicht sicher, wie ich den zugehörigen Hostnamen darüber in der Textdatei abrufen soll.
Akzeptierte Antwort:
Sie könnten -B1
verwenden um auch die vorherige Zeile zu drucken und dann nur die erste Zeile zu greifen:
$ grep -B1 'Minion' ip.txt
T5F6Z12:
Minion did not return. [Not connected]
$ grep -B1 'Minion' ip.txt | head -n1
T5F6Z12:
Oder machen Sie es mit awk
:
$ awk '/Minion/{print p} {p=$0}' ip.txt
T5F6Z12:
$ awk '/Minion/{sub(/:$/, "", p); print p} {p=$0}' ip.txt
T5F6Z12
Hier p
speichert immer die letzte Zeile. Wenn die Eingabezeile Minion
enthält , dann wird es gedruckt. Beachten Sie, dass dies im Gegensatz zu grep
für mehrere Übereinstimmungen funktioniert obige Lösung, die nur die erste Übereinstimmung liefert.