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:以下のように1行にする必要があります。

最終出力は以下の通りです。 PythonやPerlなどの他の言語を使用できますが、bashで書いているので、bashで何かが必要です。複数のタスクを実行しfor loop、変数を使用して動作させることができますが、単純または短いタスクが必要ですsed/awk。 sed/awkでこれを達成しますか?

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

答え1

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

しかし、他の方法があるかどうか知りたいです。私の質問には答えず、他の人が知らせるのを待ちます。

関連情報