Wie kann ich Zeilen einer Datei hervorheben, die mit abc beginnen und NICHT mit xyz enden?

Wie kann ich Zeilen einer Datei hervorheben, die mit abc beginnen und NICHT mit xyz enden?

Ich habe ein tägliches Skript, das jede Nacht Hardware-Statistiken von allen meinen RHEL-Servern abruft und in einemjjjjmmtt_daily.logDatei. Ich habe andere Skripte, die ich für diese Dateien ausführe, um bestimmte Daten zu extrahieren (z. B.DriveArrayStatus,HardwareStatus,DiskFreeSpace, usw.) für verschiedene Aufgaben.

BeispielHardwareStatusSkriptausgabe:

#######################
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

Da es selten zu Fehlern kommt, möchte ich die Zeilen, die beim Ausführen des Skripts Fehler anzeigen, farblich markieren. Die zu untersuchenden Zeilen kann ich mit grep auswählen:

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

Aber von hier aus muss ich NUR die geprüften Zeilen einfärben, die NICHT mit den jeweiligen zufriedenstellenden Antworten enden:

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

Ich habe versucht, die Grep-Anweisung zur Zeilenauswahl an ein zweites Grep weiterzuleiten oder egrep zu verwenden, aber dabei werden einfach alle Zeilen gelöscht, die keine zufriedenstellenden Antworten aus der Skriptausgabe liefern.

Wir wären für jede Hilfe sehr dankbar.

Antwort1

Sie können das coloramaPaket in Python verwenden, um einen einfachen Filter zu schreiben (oder es vielleicht in Ihr HardwareStatus-Skript einbinden, wenn dieses in Python geschrieben ist).

#!/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)

Um das obige Skript zu verwenden, leiten Sie die Ausgabe von HardwareStatus einfach dorthin weiter, wie Sie es in Ihrem obigen Beispiel mit grep getan haben.

Sehendie Colorama-Dokumentationfür Details.

verwandte Informationen