¿Cómo puedo resaltar líneas de un archivo que comienzan con abc y NO terminan con xyz?

¿Cómo puedo resaltar líneas de un archivo que comienzan con abc y NO terminan con xyz?

Tengo un script diario que recupera estadísticas de hardware de todos mis servidores RHEL cada noche y las guarda en unaaaammdd_daily.logarchivo. Tengo otros scripts que ejecuto en estos archivos para extraer datos específicos (es decir,EstadoDeArrrayDeUnidad,Estado del hardware,Espacio libre en disco, etc.) para diferentes tareas.

EjemploEstado del hardwaresalida del script:

#######################
Server: abc
** Fans **
Health: Ok
** Power Supplies **
Redundancy: Full
#######################
Server: bcd
** Fans **
Health: Partial
** Power Supplies **
Redundancy: Half
#######################
Server: cde
** Fans **
Health: Down
** Power Supplies **
Redundancy: None
#######################
etc... for 44 servers

Como rara vez hay fallas, me gustaría colorear las líneas que muestran algún tipo de error cuando ejecuto el script. Puedo seleccionar las líneas para examinar usando grep:

./HardwareStatus | grep '^Health\|^Redundancy\|$'

Pero a partir de aquí me falta colorear SÓLO las líneas escrutadas que NO terminan en sus respectivas respuestas satisfactorias:

./HardwareStatus | grep --color=auto -v 'Ok$\|Full$'

Intenté canalizar la instrucción grep de selección de línea a un segundo grep o usando egrep, pero simplemente elimina las líneas que no tienen respuestas satisfactorias en la salida del script.

Cualquier ayuda sería muy apreciada.

Respuesta1

Podrías usar el coloramapaquete en Python para escribir un filtro simple (o tal vez incluirlo en tu script HardwareStatus, si está escrito en Python)

#!/usr/bin/env python3

import fileinput
from colorama import init, Fore, Back, Style

init()
for line in fileinput.input():
    message = line.strip()
    if (("Health:" in message and "Ok" not in message) or
        ("Redundancy:" in message and "Full" not in message)):
        print(Back.RED + Fore.YELLOW + message + Style.RESET_ALL)
    else:
        print(message)

Para usar el script anterior, simplemente canalice la salida de HardwareStatus como lo hizo con grep en el ejemplo anterior.

Verla documentación de Coloramapara detalles.

información relacionada