data
array A
physicaldrive 2C:1:1 port 2C:box 1:bay 1 SAS 1 TB OK
physicaldrive 2C:1:2 port 2C:box 1:bay 2 SAS 1 TB OK
array B
physicaldrive 2C:1:3 port 2C:box 1:bay 3 SAS 1 TB OK
physicaldrive 2C:1:4 port 2C:box 1:bay 4 SAS 1 TB OK
array C
physicaldrive 3C:1:5 port 3C:box 1:bay 5 SAS 1 TB OK
physicaldrive 3C:1:6 port 3C:box 1:bay 6 SAS 1 TB OK
array D
physicaldrive 3C:1:7 port 3C:box 1:bay 7 SAS 1 TB OK
physicaldrive 3C:1:8 port 3C:box 1:bay 8 SAS 1 TB OK
array E
physicaldrive 4C:2:1 port 4C:box 2:bay 1 SAS 1 TB OK
physicaldrive 4C:2:2 port 4C:box 2:bay 2 SAS 1 TB OK
array F
physicaldrive 4C:2:3 port 4C:box 2:bay 3 SAS 1 TB OK
physicaldrive 4C:2:4 port 4C:box 2:bay 4 SAS 1 TB OK
array G
physicaldrive 5C:2:5 port 5C:box 2:bay 5 SAS 1 TB OK
physicaldrive 5C:2:6 port 5C:box 2:bay 6 SAS 1 TB OK
array H
physicaldrive 5C:2:7 port 5C:box 2:bay 7 SAS 1 TB OK
physicaldrive 5C:2:8 port 5C:box 2:bay 8 SAS 1 TB OK
array I
physicaldrive 6C:3:1 port 6C:box 3:bay 1 SAS 1 TB OK
physicaldrive 6C:3:2 port 6C:box 3:bay 2 SAS 1 TB OK
array J
physicaldrive 6C:3:3 port 6C:box 3:bay 3 SAS 1 TB OK
physicaldrive 6C:3:4 port 6C:box 3:bay 4 SAS 1 TB OK
array K
physicaldrive 7C:3:5 port 7C:box 3:bay 5 SAS 1 TB OK
physicaldrive 7C:3:6 port 7C:box 3:bay 6 SAS 1 TB OK
unassigned
physicaldrive 7C:3:7 port 7C:box 3:bay 7 SAS 1 TB OK
physicaldrive 7C:3:8 port 7C:box 3:bay 8 SAS 1 TB OK
| [reply] [d/l] |
It seems that you are not really deleting lines from a file, more filtering the output of a command.
Would it be safe to assume that you would want to resume printing when the next line starts with 'array'? If so, I would suggest setting a print flag to 1 initially, and then in the loop setting it to 0 if 'unassigned' shows up, and reset it to 1 if 'array' shows up. Then print to output if the print flag = 1.
my %unitMap;
my $cmd = "hpacucli ctrl slot=0 pd all show";;
open my $fd, "$cmd|" or return \%unitMap;
my $printit = 1;
while (my $row = <$fd>) {
next if $row =~ /^$|Smart/;
$printit = 0 if $row =~ /^\s*unassigned$/;
$printit = 1 if $row =~ /^\s*array .$/;
next unless $printit;
# moved processing to here; no need to manipulate lines you're
+ not going to print anyway
$row =~ s/^\s+//;
$row =~ s/[,|)|(]//g;
print "$row";
}
close $fd;
| [reply] [d/l] |
The unassigned can appear any where in the file . Basically, I am trying to delete the line containing unassigned and the 2 lines after unassigned .
| [reply] |