Linux
資料整理
我有數據,我想使用 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;
解析是粗略的,但通常是有效的。