sed 또는 awk를 사용하여 파일에서 필드 추출

sed 또는 awk를 사용하여 파일에서 필드 추출

모든 하드웨어 정보를 수집하는 bash 스크립트가 있는데 다음 메모리 정보가 누락되어 그렇게 하려고 합니다.

다음 명령은 DIMM메모리 모듈의 상태를 제공합니다.

[root@Linux ~]# hpasmcli -s 'show dimm'

DIMM Configuration
------------------
Processor #:                     1
Module #:                     1
Present:                      Yes
Form Factor:                  9h
Memory Type:                  DDR3(18h)
Size:                         8192 MB
Speed:                        1333 MHz
Supports Lock Step:           No
Configured for Lock Step:     No
Status:                       Ok

Processor #:                     1
Module #:                     12
Present:                      Yes
Form Factor:                  9h
Memory Type:                  DDR3(18h)
Size:                         8192 MB
Speed:                        1333 MHz
Supports Lock Step:           No
Configured for Lock Step:     No
Status:                       Ok

Processor #:                     2
Module #:                     1
Present:                      Yes
Form Factor:                  9h
Memory Type:                  DDR3(18h)
Size:                         8192 MB
Speed:                        1333 MHz
Supports Lock Step:           No
Configured for Lock Step:     No
Status:                       Ok

Processor #:                     2
Module #:                     12
Present:                      Yes
Form Factor:                  9h
Memory Type:                  DDR3(18h)
Size:                         8192 MB
Speed:                        1333 MHz
Supports Lock Step:           No
Configured for Lock Step:     No
Status:                       DIMM is degraded

Size:추출 하고 싶고 Status:아래와 같이 한 줄에 있어야 합니다.

최종 출력은 아래와 같습니다. Python이나 Perl과 같은 다른 언어를 사용할 수 있지만 bash로 작성 중이므로 bash에서 뭔가가 필요합니다. 여러 작업을 수행 for loop하고 변수를 사용하여 작동하게 할 수 있지만 간단하거나 짧은 작업이 필요합니다 sed/awk. sed/awk에서 이것을 달성합니까?

8192MB - Ok
8192MB - OK
8192MB - OK 
8192MB - DIMM is degraded

답변1

한 가지 솔루션은 not 을 사용 grep | awk | sed | awk하지만 다음 중 하나만 사용합니다 awk.

hpasmcli -s 'show dimm' | awk 'BEGIN { stick=0 } $1 == "Size:" { dimm[++stick] = $2" "$3} $1 == "Status:" { $1=""; status[stick]=$0 }  END {for( i in dimm ) { print dimm[i], "-", status[i] } }'
8192 MB - Ok
8192 MB - Ok
8192 MB - Ok
8192 MB - DIMM is degraded

가독성을 위해 스크립트 awk형식이 다시 지정되었습니다.

BEGIN { 
  stick=0 
} 
$1 == "Size:" { 
  dimm[++stick] = $2" "$3
} 
$1 == "Status:" { 
  $1="" 
  status[stick]=$0
}  
END {
  for( i in dimm ) { 
    print dimm[i], "-", status[i] 
  } 
}'

답변2

맙소사, 해낸 것 같아요 :)

[root@Linux ~]# hpasmcli -s 'show dimm' | egrep -e Size -e Status | awk -F: '{print $2}' | sed 's/^[ \t]*//' | awk 'NR%2{printf "%s - ",$0;next;}1'
8192 MB - Ok
8192 MB - Ok
8192 MB - Ok
8192 MB - DIMM is degraded

하지만 다른 방법이 있는지 알고 싶습니다. 제 질문에는 대답하지 않고 다른 사람들이 알려줄 때까지 기다리겠습니다.

관련 정보