드라이브 진단 명령의 출력이 있습니다.
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을 설정하여 next
두 곳의 합계 출력이 필요하지 않도록 하겠습니다.