Como posso destacar linhas de um arquivo que começam com abc e NÃO terminam com xyz?

Como posso destacar linhas de um arquivo que começam com abc e NÃO terminam com xyz?

Eu tenho um script diário que recupera estatísticas de hardware de todos os meus servidores RHEL todas as noites e as salva em umaaaammdd_daily.logarquivo. Eu tenho outros scripts que executo nesses arquivos para extrair dados específicos (ou seja,DriveArrrayStatus,Status do hardware,DiscoFreeSpace, etc.) para diferentes tarefas.

ExemploStatus do hardwaresaída do 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 raramente há falhas, gostaria de colorir as linhas que apresentam algum tipo de erro ao executar o script. Posso selecionar as linhas a serem examinadas usando grep:

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

Mas a partir daqui preciso colorir APENAS as linhas examinadas que NÃO terminam em suas respectivas respostas satisfatórias:

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

Eu tentei canalizar a instrução grep de seleção de linha para um segundo grep ou usando egrep, mas ele simplesmente descarta todas as linhas que não possuem respostas satisfatórias na saída do script.

Qualquer ajuda seria muito apreciada.

Responder1

Você poderia usar o coloramapacote em Python para escrever um filtro simples (ou talvez incluí-lo em seu script HardwareStatus, se estiver escrito em 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 o script acima, basta canalizar a saída de HardwareStatus para ele, como você fez com grep no exemplo acima.

Vera documentação do Coloramapara detalhes.

informação relacionada