3行セットを列に置き換える

3行セットを列に置き換える

次の項目を含むファイルがあります。

[root@ovmm329 ovm_utils]# cat /tmp/disk.txt
Physical Disk : 'IBM (67) device=/dev/mapper/360050768018206483000000000000453 shareddisk=true
Physical Disk : 'IBM (58) device=/dev/mapper/36005076801820648300000000000043f shareddisk=true
Physical Disk : 'IBM (59) device=/dev/mapper/360050768018206483000000000000440 shareddisk=true
Physical Disk : 'IBM (71) device=/dev/mapper/360050768018206483000000000000497 shareddisk=true
[root@ovmm329 ovm_utils]#

私は私が知っているすべての可能な方法でsedとawkを試してみましたが、私が望む形式で得ることができませんでした。次の形式のファイルが必要です。

Physical Disk  device                                          Shareddisk
IBM (67)        /dev/mapper/360050768018206483000000000000453  true
IBM (58)        /dev/mapper/36005076801820648300000000000043f  true
IBM (59)        /dev/mapper/360050768018206483000000000000440  true
IBM (71)        /dev/mapper/360050768018206483000000000000497  true

答え1

awk変数と複数の一致を使用すると、各行を読み取り、必要なものを保存してから、最後の一致を印刷して再開できます。

#!/usr/bin/awk -f

BEGIN {
  DISK=""
  DEVICE=""
  FS=" : "
  print "Physical Disk\tdevice\t\t\t\t\t\tShareddisk"
  }

/Physical Disk/ {
  DISK=$2
  FS="="
}

/device/ {
  DEVICE=$2
}

/shareddisk/ {
  print DISK "\t" DEVICE "\t" $2
  FS=" : "
  }

次に、ファイルに対してスクリプトを実行します。awk -f ./script.awk ./disk.txt

$ awk -f ./parse.awk ./disk.txt
Physical Disk   device                                          Shareddisk
'IBM (67)       /dev/mapper/360050768018206483000000000000453   true
'IBM (58)       /dev/mapper/36005076801820648300000000000043f   true
'IBM (59)       /dev/mapper/360050768018206483000000000000440   true
'IBM (71)       /dev/mapper/360050768018206483000000000000497   true

スクリプトを分解するには、BEGIN最初に実行されたブロックから始めます。いくつかの変数を定義し、フィールド区切り文字を設定し、FSタイトルを印刷します。最初の一致が使用され、Physical Diskディスク名が変数に保存されます。=デバイスと共有ディスク行を使用しているため、フィールド区切り記号が=。ヒットラインが一致すると、/shareddisk/変数が印刷され、フィールド区切り文字が次の物理ディスクラインと一致するように再変更されます。

編集する

これは、ファイル形式が次のとおりであると仮定します。

cat disk.txt
Physical Disk : 'IBM (67)
  device=/dev/mapper/360050768018206483000000000000453
  shareddisk=true
Physical Disk : 'IBM (58)
  device=/dev/mapper/36005076801820648300000000000043f
  shareddisk=true
Physical Disk : 'IBM (59)
  device=/dev/mapper/360050768018206483000000000000440
  shareddisk=true
Physical Disk : 'IBM (71)
  device=/dev/mapper/360050768018206483000000000000497
  shareddisk=true

関連情報