出力bashで特定の行の色を変更する

出力bashで特定の行の色を変更する

ドライブ診断コマンドの出力があります。

Slot Number        : 0   
Drive's position   : DiskGroup 0  
Media Error        : 0   
Other Error        : 0   
Predictive Failure : 0   
Raw Size           : 447.130 GB [0x37e436b0 Sectors]
Firmware state     : Online, Spun Up 
Inquiry Data       : PHYM813201FL480BGNSSDSC2KG480G7R SCV1DL58  
Foreign State      : None   
Media Type         : Solid State Device 
Temperature        : 20C (68.00 F) 
S.M.A.R.T alert    : No   

Slot Number        : 1   
Drive's position   : DiskGroup 0  
Media Error        : 0   
Other Error        : 0   
Predictive Failure : 0   
Raw Size           : 447.130 GB [0x37e436b0 Sectors]
Firmware state     : Online, Spun Up 
Inquiry Data       : PHYM81320058480BGNSSDSC2KG480G7R SCV1DL58  
Foreign State      : None   
Media Type         : Solid State Device 
Temperature        : 21C (69.80 F) 
S.M.A.R.T alert    : No   

Slot Number        : 2   
Drive's position   : DiskGroup 1  
Media Error        : 0   
Other Error        : 0   
Predictive Failure : 0   
Raw Size           : 1.090 TB [0x8bba0cb0 Sectors]
Firmware state     : Online, Spun Up 
Inquiry Data       : SEAGATE ST1200MM0099 ST31WFK0VEBK 
Foreign State      : None   
Media Type         : Hard Disk Device 
Temperature        : 22C (71.60 F) 
S.M.A.R.T alert    : No   

Slot Number        : 3   
Drive's position   : DiskGroup 1  
Media Error        : 0   
Other Error        : 0   
Predictive Failure : 0   
Raw Size           : 1.090 TB [0x8bba0cb0 Sectors]
Firmware state     : Online, Spun Up 
Inquiry Data       : SEAGATE ST1200MM0099 ST31WFK0T07T 
Foreign State      : None   
Media Type         : Hard Disk Device 
Temperature        : 22C (71.60 F) 
S.M.A.R.T alert    : No   

Slot Number        : 4   
Drive's position   : DiskGroup 1  
Media Error        : 0   
Other Error        : 0   
Predictive Failure : 0   
Raw Size           : 1.090 TB [0x8bba0cb0 Sectors]
Firmware state     : Online, Spun Up 
Inquiry Data       : SEAGATE ST1200MM0099 ST31WFK0VAJK 
Foreign State      : None   
Media Type         : Hard Disk Device 
Temperature        : 22C (71.60 F) 
S.M.A.R.T alert    : No   

Slot Number        : 5   
Drive's position   : DiskGroup 1  
Media Error        : 0   
Other Error        : 0   
Predictive Failure : 0   
Raw Size           : 1.090 TB [0x8bba0cb0 Sectors]
Firmware state     : Online, Spun Up 
Inquiry Data       : SEAGATE ST1200MM0099 ST31WFK0SYPC 
Foreign State      : None   
Media Type         : Hard Disk Device 
Temperature        : 22C (71.60 F) 
S.M.A.R.T alert    : No   

Slot Number        : 6   
Drive's position   : DiskGroup 1  
Media Error        : 0   
Other Error        : 0   
Predictive Failure : 0   
Raw Size           : 1.090 TB [0x8bba0cb0 Sectors]
Firmware state     : Online, Spun Up 
Inquiry Data       : SEAGATE ST1200MM0099 ST31WFK0MVN2 
Foreign State      : None   
Media Type         : Hard Disk Device 
Temperature        : 22C (71.60 F) 
S.M.A.R.T alert    : No   

Slot Number        : 7   
Drive's position   : DiskGroup 1  
Media Error        : 0   
Other Error        : 0   
Predictive Failure : 0   
Raw Size           : 1.090 TB [0x8bba0cb0 Sectors]
Firmware state     : Online, Spun Up 
Inquiry Data       : SEAGATE ST1200MM0099 ST31WFK0SZ2L 
Foreign State      : None   
Media Type         : Hard Disk Device 
Temperature        : 22C (71.60 F) 
S.M.A.R.T alert    : No 

":"記号の後の行3、4、5、7、9、および12でのみ各ドライブを変更したいと思います。この結果は標準ですが、内容が異なる場合は色を追加したいと思います。たとえば、

Slot Number        : 7   
Drive's position   : DiskGroup 1  
Media Error        : 4  (I want the whole line in red)
Other Error        : 3  (I want the whole line in red)
Predictive Failure : 1  (I want the whole line in red)
Raw Size           : 1.090 TB [0x8bba0cb0 Sectors]
Firmware state     : Failed. (I want the whole line in red)
Inquiry Data       : SEAGATE ST1200MM0099 ST31WFK0SZ2L 
Foreign State      : Unconfigured  (I want the whole line in red)
Media Type         : Hard Disk Device 
Temperature        : 22C (71.60 F) 
S.M.A.R.T alert    : Yes  (I want the whole line in red)

各ドライブに対してこれらの変更を実行したいと思います。ドライブの数は可変であり、時にはより多く、時には少ない。

私はこれを試しましたが、うまくいきません。

awk -F ':' '$1~/^(Media Error|Other Error|Predictive Failure)$/ && $2 > 0 {print "\033[31m" $0 "\e[0m"; next} 1'

ベストアンサー1

あなたはそれを修正するのに非常に近づいています。 BashとAwkで答えます。あなたが求めるものは次のとおりです。

$ awk '/(Media Error|Other Error|Predictive Failure|Firmware state|Foreign State|S\.M\.A\.R\.T alert)[[:blank:]]+:/{print "\033[31m" $0"\033[0m"; next} 1' < <(your_drive_diag_command)

投稿する前に試した内容についてコメントする価値があります。

  • -F ':'
    デフォルトの空白以外のフィールド区切り文字を指定することは、レコード内のフィールドに対して実際に操作を実行する必要がある場合にのみ役立ちます。ここではそうではありません。

  • $1 ~ /^(Media Error|Other Error|Predictive Failure)$/ ...
    (OR)ブール値を使用して、最初のフィールドの文字列値に対する3つの異なる可能性をテストできます(フィールド$1区切り文字を指定する前)。原則としてこれは問題ありませんが、この場合はレコード全体のどこに文字列があるかをテストでき、GawkスタイルまたはAwkスタイルを使用して目的の文字列正規表現を実行することを確認できます。これにより、見つかった各文字列のコロンの前に1より多くのスペース/タブが追加されます。つまり:|$0\s+:[[:blank:]]+::おそらくとを含む正規表現を$1使用したテストは抑制できます。^$

  • 一貫性のためにカラーコーディングを調整すること\eによって\033

編集1:
@JosueBaquerizoの追加仕様に従って、ロジックはおよびの条件文を$1含むように変更されました$2

$ awk -F ' *: *' '
      ($1 ~ /Media Error|Other Error|Predictive Failure/ && $2 > 0 ||
       $1 ~ /Firmware state/ && $2 ~ "Failed" ||
       $1 ~ /Foreign State/ && $2 ~ "Unconfigured" || 
       $1 ~ /S\.M\.A\.R\.T alert/ && $2 ~ "Yes") {print "\033[31m" $0"\033[0m"; next} 1' < <(your_drive_diag_command)

おすすめ記事