Ho un file di testo che elenca un nome host e nella riga direttamente sotto indica i risultati di un ping di un servitore salt. Ecco un esempio di output:
T5F6Z12:
Minion did not return. [Not connected]
Devo prima essere in grado di identificare se il testo (Minion non è stato restituito) esiste e, in tal caso, prendere il nome host associato all'errore in modo da poter eseguire altri comandi su quel server.
Ho iniziato con questo:
if grep -q "Minion" /srv/salt/test/ping_results
then
Quindi sono abbastanza sicuro di dover cercare la parola "Minion" perché verrà visualizzata solo per i server che hanno fallito il test. Ma una volta che ho identificato che esiste, non sono sicuro di come prendere il nome host associato sopra di esso nel file di testo.
Risposta accettata:
Potresti usare -B1
per stampare anche la riga precedente e poi prendere solo la prima riga:
$ grep -B1 'Minion' ip.txt
T5F6Z12:
Minion did not return. [Not connected]
$ grep -B1 'Minion' ip.txt | head -n1
T5F6Z12:
Oppure fallo con awk
:
$ awk '/Minion/{print p} {p=$0}' ip.txt
T5F6Z12:
$ awk '/Minion/{sub(/:$/, "", p); print p} {p=$0}' ip.txt
T5F6Z12
Qui p
continua a salvare l'ultima riga. Quando la riga di input contiene Minion
, quindi viene stampato. Nota che funzionerà per più corrispondenze a differenza di grep
soluzione sopra che dà solo la prima corrispondenza.