abc で始まり、xyz で終わらないファイルの行を強調表示するにはどうすればよいでしょうか?

abc で始まり、xyz で終わらないファイルの行を強調表示するにはどうすればよいでしょうか?

私は毎晩すべてのRHELサーバーからハードウェア統計情報を取得し、それをyyyymmdd_毎日.logファイル。これらのファイルに対して特定のデータを抽出するために実行する他のスクリプトがあります(つまりドライブアレイステータスハードウェアステータスディスク空き容量など)をさまざまなタスクに使用します。

ハードウェアステータススクリプト出力:

#######################
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 ステートメントを 2 番目の grep にパイプしたり、egrep を使用したりしてみましたが、スクリプトの出力から満足のいく応答が得られない行はそのまま削除されます。

ご協力いただければ幸いです。

答え1

Python のパッケージを使用して、colorama簡単なフィルターを作成することができます (または、Python で記述されている HardwareStatus スクリプトに含めることもできます)。

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

上記のスクリプトを使用するには、上記の例で grep を使用したのと同じように、HardwareStatus の出力をパイプするだけです。

見るColoramaのドキュメント詳細については。

関連情報