ドライブ診断コマンドの出力があります。
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)
答え2
awkを使用してください。
$ awk -F '[[:space:]]*:[[:space:]]*' '
BEGIN {
tag2val["Media Error"] = 0
tag2val["Other Error"] = 0
tag2val["Predictive Failure"] = 0
tag2val["Firmware state"] = "Online, Spun Up"
tag2val["Foreign State"] = "None"
tag2val["S.M.A.R.T alert"] = "No"
}
{
tag = $1
val = $2
sub(/^[[:space:]]+/,"",tag)
sub(/[[:space:]]+$/,"",val)
}
(tag in tag2val) && (val != tag2val[tag]) {
$0 = "\033[31m" $0 "\033[0m"
}
{ print }
' file
$ 2の最初の項目が空白にならないように、周囲にスペースを含め、行末から末尾の:
スペース(入力のスペースなど)を削除します。また、カラーエンドエスケープシーケンスをクリーンアップしてそこに印刷する代わりに$ 0を設定して、2つの合計のnext
出力を必要としないようにします。