Tengo un archivo de texto que enumera un nombre de host y en la línea directamente debajo indica los resultados de un ping de un salt minion. Aquí hay una salida de ejemplo:
T5F6Z12:
Minion did not return. [Not connected]
Necesito poder identificar primero si existe el texto (Minion no regresó) y, de ser así, tomar el nombre de host asociado con el error para poder ejecutar otros comandos contra ese servidor.
Empecé con esto:
if grep -q "Minion" /srv/salt/test/ping_results
then
Así que estoy bastante seguro de que necesito buscar la palabra "Minion" porque solo aparecerá para los servidores que fallaron la prueba. Pero una vez que identifiqué que existe, no estoy seguro de cómo capturar el nombre de host asociado arriba en el archivo de texto.
Respuesta aceptada:
Podrías usar -B1
para imprimir la línea anterior también y luego tomar solo la primera línea:
$ grep -B1 'Minion' ip.txt
T5F6Z12:
Minion did not return. [Not connected]
$ grep -B1 'Minion' ip.txt | head -n1
T5F6Z12:
O hazlo con awk
:
$ awk '/Minion/{print p} {p=$0}' ip.txt
T5F6Z12:
$ awk '/Minion/{sub(/:$/, "", p); print p} {p=$0}' ip.txt
T5F6Z12
Aquí p
sigue guardando la última línea. Cuando la línea de entrada contiene Minion
, luego se imprime. Tenga en cuenta que esto funcionará para múltiples coincidencias a diferencia de grep
solución anterior que da solo la primera coincidencia.