Как выделить строки файла, которые начинаются с abc и НЕ заканчиваются на xyz?

Как выделить строки файла, которые начинаются с abc и НЕ заканчиваются на xyz?

У меня есть ежедневный скрипт, который каждую ночь получает статистику оборудования со всех моих серверов RHEL и сохраняет ее вггггммдд_daily.logфайл. У меня есть другие скрипты, которые я запускаю для этих файлов, чтобы извлечь определенные данные (т.е.DriveArrrayStatus,Состояние оборудования,DiskFreeSpaceи т. д.) для различных задач.

ПримерСостояние оборудованияВывод скрипта:

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

Поскольку сбои случаются редко, я хотел бы раскрасить строки, которые показывают какую-либо ошибку при запуске скрипта. Я могу выбрать строки для проверки с помощью grep:

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

Но отсюда мне нужно раскрасить ТОЛЬКО те тщательно изученные строки, которые НЕ заканчиваются соответствующими им удовлетворительными ответами:

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

Я пробовал передавать оператор grep выбора строки во второй grep или использовать egrep, но он просто удаляет все строки, которые не имеют удовлетворительных ответов из вывода скрипта.

Будем очень благодарны любой помощи.

решение1

Вы можете использовать coloramaпакет в Python для написания простого фильтра (или, возможно, включить его в свой скрипт HardwareStatus, если он написан на 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)

Чтобы использовать приведенный выше скрипт, просто передайте ему вывод HardwareStatus, как вы делали это с помощью grep в примере выше.

Видетьдокументация Coloramaдля получения подробной информации.

Связанный контент