Hi Rob,

Thanks for your response and to everyone else who had given their thoughts,
especially John. This whole exercise is turning out to be a "fun" way of
learning arrays and print formatting.

I tried the script that you suggested and it is giving some error and not
sure how to get around it. FYI, I commented out use strict and use warnings
for the time being 'coz it gives error as below:

Use of implicit split to @_ is deprecated at ./df.pl line 30.
Bareword "MBytes" not allowed while "strict subs" in use at ./df.pl line 32.
Bareword "GBytes" not allowed while "strict subs" in use at ./df.pl line 33.
Execution of ./df.pl aborted due to compilation errors.

I then run the script and it gives error as below:

Can't locate object method "rec" via package "Filesystem" (perhaps you
forgot to load "Filesystem"?) at ./df.pl line 30.

Does it matter that the df -k header is not Filesystem KBytes Used Avail
Capacity Mount?

For Solaris, the header is
Filesystem            kbytes    used   avail capacity  Mounted on

For Linux, the header is
Filesystem           1K-blocks      Used Available Use% Mounted on

Note that the Filesystem KBytes Used Avail Capacity Mount is a
pre-formatted header in the UNIX shell version of the script. Also, the df
-k output for example on a Linux system will sometimes flow over one (1)
line, example below. FYI, if re-directed to a file, all output line are
one-liner, if re-directed to STDOUT, output is as shown below. Perhaps the my
@data = `df -k`; line is giving the same output when df is not re-directed
to a file. Will check that out.

Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/vg0-lv1   16251816   3067896  12345060  20% /
/dev/mapper/vg0-lv2    8125880   3265032   4441420  43% /home
/dev/mapper/vg0-lv3    2031440     73672   1852912   4% /tmp
/dev/mapper/vg0-lv4    4062912    642436   3210764  17% /var
/dev/mapper/vg0-lv5    1015704     34104    929172   4% /var/tmp
/dev/mapper/vg0-lv6   73133256  46655684  22702700  68% /u01
/dev/sda1               101086     28173     67694  30% /boot
tmpfs                 49422824    237564  49185260   1% /dev/shm
dev0ns100:/vol/vol_ns953_snap/rac_shared
                     125829120  32990784  92838336  27% /nas_mnt/rac_shared
/dev/asm/akl1od200-335
                     786432000 312987896 473444104  40% /asm

The script is as below:

#!/usr/bin/perl

#use strict;
#use warnings;

use List::Util qw/max/;

sub kb_to_mb {
   sprintf "%.0f-MB", shift(@_) / 1024;
}

sub kb_to_gb {
   sprintf "%.0f-GB", shift(@_) / (1024 * 1024);
}

my @data = `df -k`;

# Drop the header line and sort the data lines
#
shift @data;
@data = sort @data;

# Parse each data record into a hash.
# Convert the KBytes field to new MBytes and GBytes fields.
# Do the same in-place for Used and Avail.
# And replace the data line with a referece to the new hash
#
foreach (@data) {
   my %rec;
*   rec{qw/Filesystem KBytes Used Avail Capacity Mount/} = split;
*
   rec{MBytes} = kb_to_mb $rec{KBytes};
   rec{GBytes} = kb_to_gb $rec{KBytes};

   rec{$_} = kb_to_mb $rec{$_} for qw/Used Avail/;

   $_ = \%rec;
}

# Build a %width hash with column names for keys and maximum field width
for values.
# Include the column names themselves in the list, in case header is longer
than all data.
# Negate Filesystem and Mount widths to left-justify them.
#
my %width;
foreach my $key (keys %{$data[0]}) {
   width{$key} = max map length, ($key, map $_->{$key}, @data);
}
$width{Filesystem} = -$width{Filesystem};
$width{Mount} = -$width{Mount};

# Set the list of columns to be displayed.
# Build a format string consisting of sufficient %*s format specifications,
separated by spaces.
#
my @columns = qw/Filesystem MBytes Used Avail Capacity Mount/;
my $format = join(' ', ('%*s') x @columns)."\n";

# Print the column headers
#
printf $format, map(($width{$_}, $_), @columns);

# Print matching rows of hyphens
#
printf $format, map(($width{$_}, '-' x abs $width{$_}), @columns);

# Print each row of data
#
foreach my $rec (@data) {
   printf $format, map(($width{$_}, $rec->{$_}), @columns);
}


On Tue, Oct 25, 2011 at 9:04 PM, Rob Dixon <rob.di...@gmx.com> wrote:

> On 24/10/2011 21:35, John W. Krahn wrote:
> >
> > You forgot the part where the OP wants to sort the output. :-)
>
> I thought I didn't have enough information to know how the OP wanted the
> report sorted, but I see from the attacked shell script that the
> original lines from the df output are sorted before reformatting. To
> achieve that the complete df listing must be in memory, so it is simpler
> to use backticks rather than opening a pipe.
>
> The fix below replaces the original code from
>
>   # Open a pipe from the df command
>
> to the end of the while loop. The rest of the program stays the same.
>
> Cheers,
>
> Rob
>
>
> my @data = `df -k`;
>
> # Drop the header line and sort the data lines
> #
> shift @data;
> @data = sort @data;
>
> # Parse each data record into a hash.
> # Convert the KBytes field to new MBytes and GBytes fields.
> # Do the same in-place for Used and Avail.
> # And replace the data line with a referece to the new hash
> #
> foreach (@data) {
>
>   my %rec;
>  @rec{qw/Filesystem KBytes Used Avail Capacity Mount/} = split;
>
>  $rec{MBytes} = kb_to_mb $rec{KBytes};
>  $rec{GBytes} = kb_to_gb $rec{KBytes};
>
>  $rec{$_} = kb_to_mb $rec{$_} for qw/Used Avail/;
>
>   $_ = \%rec;
> }
>
> **OUTPUT**
>
> Filesystem                                MBytes      Used    Avail
> Capacity Mount
> -------------------------------------- --------- --------- --------
> -------- -----------------
> /dev/md/dsk/d1                           3027-MB   2424-MB   542-MB
>  82% /
> /dev/md/dsk/d3                           3027-MB   1558-MB  1408-MB
>  53% /var
> /dev/md/dsk/d4                           4886-MB   4229-MB   608-MB
>  88% /opt
> /proc                                       0-MB      0-MB     0-MB
> 0% /proc
> dev0ns951:/vol/vol_admin/admin          38810-MB  32189-MB  6621-MB
>  83% /nas_mnt/admin
> dev0ns951:/vol/vol_admin/admin/cpadocs  38810-MB  32189-MB  6621-MB
>  83% /opt/info
> dev0ns951:/vol/vol_admin/common        314368-MB 260633-MB 53735-MB
>  83% /nas_mnt/common
> dev0ns951:/vol/vol_admin/docs            8270-MB   7076-MB  1194-MB
>  86% /nas_mnt/docs
> dev0ns951:/vol/vol_admin/prodhome       32870-MB  25964-MB  6906-MB
>  79% /home/users
> dev0ns951:/vol/vol_admin/prodhome       32870-MB  25964-MB  6906-MB
>  79% /nas_mnt/prodhome
> dev0ns951:/vol/vol_admin/saphome           90-MB     37-MB    53-MB
>  42% /nas_mnt/saphome
> fd                                          0-MB      0-MB     0-MB
> 0% /dev/fd
> mnttab                                      0-MB      0-MB     0-MB
> 0% /etc/mnttab
> swap                                     8460-MB      0-MB  8460-MB
> 1% /var/run
> swap                                     8513-MB     54-MB  8460-MB
> 1% /tmp
>
> --
> To unsubscribe, e-mail: beginners-unsubscr...@perl.org
> For additional commands, e-mail: beginners-h...@perl.org
> http://learn.perl.org/
>
>
>

Reply via email to