我在下面编写脚本但是脚本运行结果有错误 "在连接(。)中使用未初始化的值$ bay_name或在test.pl第92行使用字符串。"
#!/usr/bin/env perl
use strict;
use warnings;
use JSON;
use Getopt::Long;
use POSIX qw/strftime/;
## perl time variable
my $dt = strftime('%Y%m%d%H%M%S',localtime);
## Variable reset
my ($key, $value, $bay_name, $dot) = '';
$dot = ' ';
for (`cat test | awk 'NF' | awk /:/ | sed -e 's/ \+/ /g' -e 's/ : /:/g' | egrep "All|Bay|Number"`)
{
($key, $value) = m/(.*?):(.*?)$/g
or next;
if ($key eq 'BayName') {
$bay_name = $value;
}
else {
$key = $bay_name . $dot . $key;
}
if ($key eq 'BayName') {
undef $key;
}
else {
print "\t,\n";
print "\t{\n";
print "\t\t\"{#HWNAMES}\":\"$key\",\n";
print "\t\t\"{#HWSTATUS}\":\"$value\"\n";
print "\t}\n";
}
}
我想修复它
测试文件的内容低于内容
System Bay
Bay Name : SB-1
Number of Standby Power Supplies : 4
Number of Drive Enclosures : 0
Number of Enclosure Slots : 2
Number of MIBE Enclosures : 2
Summary Status of Contained Modules
All Standby Power Supplies : Normal
All Enclosures : Normal
All Link Control Cards : Normal
All Power Supplies : Normal
All Enclosure Slots : Normal
All Power Supplies : Normal
All Fans : Normal
All Management Modules : Normal
All IO Module Carriers : Normal
All Directors : Normal
All MIBE Enclosures : Normal
All Power Supplies : Normal
Drive Bays
Bay Name : DB-1A
Number of Standby Power Supplies : 8
Number of Drive Enclosures : 16
Summary Status of Contained Modules
All Enclosures : Normal
All Link Control Cards : Normal
All Power Supplies : Normal
All Standby Power Supplies : Normal
我想要下面的结果 Bay Name行在输出中被删除 所有内容更改打击格式
{
"{#HWNAMES}":"SB-1 All Standby Power Supplies",
"{#HWSTATUS}":"Normal"
},
{
"{#HWNAMES}":"SB-1 All Enclosures",
"{#HWSTATUS}":"Normal"
},
{
"{#HWNAMES}":"SB-1 All Link Control Cards",
"{#HWSTATUS}":"Normal"
},
{
"{#HWNAMES}":"SB-1 All Power Supplies",
"{#HWSTATUS}":"Normal"
},
{
"{#HWNAMES}":"SB-1 All Enclosure Slots",
"{#HWSTATUS}":"Normal"
},
{
"{#HWNAMES}":"SB-1 All Power Supplies",
"{#HWSTATUS}":"Normal"
},
{
"{#HWNAMES}":"SB-1 All Fans",
"{#HWSTATUS}":"Normal"
},
{
"{#HWNAMES}":"SB-1 All Management Modules",
"{#HWSTATUS}":"Normal"
},
{
"{#HWNAMES}":"SB-1 All IO Module Carriers",
"{#HWSTATUS}":"Normal"
},
{
"{#HWNAMES}":"SB-1 All Directors",
"{#HWSTATUS}":"Normal"
},
{
"{#HWNAMES}":"SB-1 All MIBE Enclosures",
"{#HWSTATUS}":"Normal"
},
{
"{#HWNAMES}":"SB-1 All Power Supplies",
"{#HWSTATUS}":"Normal"
}
以下是我的剧本
for (`/opt/emc/SYMCLI/bin/symcfg -sid $sid list -env_data`) {
if (/^\s+Bay Name\s+:\s+(\S+)$/){
$bay_name = $1;
} elsif (/(Number.*)\s+:\s+(\d+)/){
print "\t{\n";
print "\t\t\"{#HWNAMEC}\":\"$bay_name $1\",\n";
print "\t\t\"{#HWCOUNT}\":\"$2\"\n";
print "\t},\n";
} elsif (/(All.*)\s+:\s+(\S+)/) {
print "\t{\n";
print "\t\t\"{#HWNAMES}\":\"$bay_name $1\",\n";
print "\t\t\"{#HWSTATUS}\":\"$2\"\n";
print "\t},\n";
}
}
答案 0 :(得分:1)
不使用所有的shell管道和函数,你可以通过一点perl来实现这一点。
use strict;
use warnings;
my $bay_name;
while (<DATA>) {
chomp();
if (/^\s+Bay Name\s+:\s+(\S+)$/){
$bay_name = $1;
} elsif (/(Number of Standby Power Supplies)\s+:\s+(\d+)/){
print "$bay_name $1 : $2\n";
} elsif (/(All Standby Power Supplies|All Enclosures)\s+:\s+(\S+)/) {
print "$bay_name $1 : $2\n";
}
}
__DATA__
System Bay
Bay Name : SB-1
Number of Standby Power Supplies : 4
Summary Status of Contained Modules
All Standby Power Supplies : Normal
Drive Bays
Bay Name : DB-1A
Number of Standby Power Supplies : 8
Summary Status of Contained Modules
All Enclosures : Normal
根据您的示例数据
生成以下输出SB-1 Number of Standby Power Supplies : 4
SB-1 All Standby Power Supplies : Normal
DB-1A Number of Standby Power Supplies : 8
DB-1A All Enclosures : Normal
答案 1 :(得分:1)
您提出的实际问题通过添加
来解决my $bay_name;
在for
循环中。您已启用use strict
,这是一种很好的做法,需要声明变量,但不会声明$bay_name
,这是错误消息所指的内容。
然而,其他人已经指出从Perl调用管道是完全没必要的,你可以用其他各种方式改进代码。