Linux

資料整理

  • November 14, 2018

我有數據,我想使用 shell/perl 腳本以以下格式輸出。

數據:

Virtual Machine  Test status  Running.
Assigned Server  OVS001.local
Virtual Disk  Test_DISK1 (30) size  61GB
Physical Disk  HITACHI (110)
Physical Disk  HITACHI (113)
Physical Disk  HITACHI (111)

所需輸出:

Virtual_Machine    Vdsks               size     Physical_Disks
Test               Test_DISK1          61GB        -
Test                 -                  -        HITACHI (110)
Test                 -                  -        HITACHI (113)
Test                 -                  -        HITACHI (111)

這需要為多個虛擬機拉取..

perl正是為此類問題而設計和製造的。它的綽號是“病態的不拘一格的垃圾清單”。

閱讀有關perlform的文件。您所做的是讀取您的數據(例如,一次一行),解析它,填充到變數中,然後發出write基於format您定義的輸出目前數據的命令。

對於您的數據,您可能具有標題格式:

format STDOUT_TOP = 
Virtual_Machine    Vdsks               size      Physical_Disks
-----------------  ------------------  --------- ---------------
.

每行輸出另一個:

format STDOUT = 
@<<<<<<<<<<<<<<<<  @<<<<<<<<<<<<<<<<<  @>>>>>>>>>>> -
$virtualmachine,   @vdisk,             @vdisk_size
@<<<<<<<<<<<<<<<<  @<<<<<<<<<<<<<<<~~  @>>>>>>>>>~~ -
$#vdisk<0?'':$virtualmachine,   shift(@vdisk), shift(@vdisk_size)
@<<<<<<<<<<<<<<<<  -                                ^<<<<<<<<<<<<~~
$#disks<0?'':$virtualmachine,                       shift(@disks)

.

我不確定您是如何獲取數據的,但假設您將其保存在一個文件中,並由兩個換行符分隔。每個主機都是一行:

Virtual Machine  Test1 status  Running.
Assigned Server  OVS001.local
Virtual Disk  Test_DISK1 (30) size  61GB
Physical Disk  HITACHI (110)
Physical Disk  HITACHI (113)
Physical Disk  HITACHI (111)

Virtual Machine  Test status  Running.
Assigned Server  OVS002.local
Virtual Disk  Test_DISK1 (30) size  41GB
Physical Disk  HITACHI (110)
Physical Disk  HITACHI (113)
Physical Disk  HITACHI (111)

您可以像這樣設置輸入分隔符:

$/="\n\n";

每次閱讀時,您都會得到一整塊文本,即一個虛擬主機的所有行。

while (<>) { 
   # process one virtual machine
}

現在樂趣開始了:解析輸入。在 while 循環中,您可以這樣做:

my @lines=split("\n");
local @disks=(); # initialize
local $virtualmachine="unknown";
local $physicalserver="unknown";
local @vdisk=("unknown");
local @vdisk_size=("unknown");
foreach (@lines) { 
   $virtualmachine = $1 if /^Virtual Machine\s+(\S+)\s+status\s+/;
   $physicalserver = $1 if /^Assigned Server\s+(\S+)/;
   do { push @vdisk,$1; push @vdisk_size,$2; }
      if /^Virtual Disk\s+(\S+).* size\s+(\d+\w+)/;
   push @disks,$1 if /^Physical Disk\s+(.*)/;
}
write;

解析是粗略的,但通常是有效的。

引用自:https://unix.stackexchange.com/questions/260429