출력 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)

답변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두 곳의 합계 출력이 필요하지 않도록 하겠습니다.

관련 정보