Hi all, Am trying to write/convert a customized df script in Perl and need some help with regards to using arrays and file handlers.
At the moment am using
system("df -k > /tmp/df_tmp.00");
To re-direct the df output. Am using df -k because some of the Solaris and
HP servers does not have df -h, by using df -k, am sure it will work on all
of them.
Sample output is as below:
Filesystem kbytes used avail capacity Mounted on
/dev/md/dsk/d1 3099287 2482045 555257 82% /
/proc 0 0 0 0% /proc
mnttab 0 0 0 0% /etc/mnttab
fd 0 0 0 0% /dev/fd
/dev/md/dsk/d3 3099287 1595167 1442135 53% /var
swap 8663192 368 8662824 1% /var/run
swap 8717624 54800 8662824 1% /tmp
/dev/md/dsk/d4 5003466 4330989 622443 88% /opt
dev0ns951:/vol/vol_admin/common 321912832 266888556 55024276 83%
/nas_mnt/common
dev0ns951:/vol/vol_admin/admin/cpadocs 39741440 32961924 6779516 83%
/opt/info
dev0ns951:/vol/vol_admin/admin 39741440 32961924 6779516 83%
/nas_mnt/admin
dev0ns951:/vol/vol_admin/docs 8468480 7245924 1222556 86%
/nas_mnt/docs
dev0ns951:/vol/vol_admin/prodhome 33658880 26586948 7071932 79%
/nas_mnt/prodhome
dev0ns951:/vol/vol_admin/saphome 92160 37960 54200 42%
/nas_mnt/saphome
dev0ns951:/vol/vol_admin/prodhome 33658880 26586948 7071932 79%
/home/users
Then I get rid of the header as below, more dependence on using Unix OS
commands, sorry Perl gurus, don't know what's the equivalent of the commands
below in Perl :-)
$num_lines=`wc -l /tmp/df_${processid}.00 | awk '{ print \$1 }'`;
$num_lines=$num_lines-1;
system("tail -${num_lines} /tmp/df_tmp.00 > /tmp/df_tmp.01");
Then I do the lines below which read each line to an array:
open(DFTMP, "/tmp/df_tmp.01");
while ( <DFTMP> )
{
chomp;
@df_lines= split(' ',$_);
}
close DFTMP;
My question is, first of all, how to do an array operation where I can
operate on the field/column 2,3,4 where I can divide them by 1024 or
1024/1024 so their KB values are converted to MB or GB? Or do I have to
foreach each array member and do the division line by line? Would be nice if
I can use the df header as hash references :-)
Also need to be able to get the max(length) of each column so I can use it
for formatting the output and I can't find a Perl max or min function :(-
BTW, if anyone is interested to know what am trying to do, I've attached a
version of the script in Korn shell.
Am wanting to convert it to Perl 'coz I have a server that has 30+ lines of
df output and it takes ages to run using Korn shell. I am hoping that it
will run faster in Perl, John W. Krahn had proven that to be case lots of
times, thanks John :-)
Plus it is a good exercise to learn Perl arrays and sorting too.
Any advise/feedback much appreciated. Thanks in advance.
Sample output of the run using the Korn shell script as below:
Filesystem MBytes Used Avail
Capacity Mount
--------------------------------------------- --------- --------- ---------
-------- -----------------------------------
/dev/md/dsk/d1 3027-MB 2424-MB
542-MB 82% /
/dev/md/dsk/d3 3027-MB 1560-MB
1406-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/docs 8271-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 91-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
8459-MB 1% /var/run
swap 8513-MB 54-MB
8459-MB 1% /tmp
mydf.sh
Description: Bourne shell script
-- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected] http://learn.perl.org/
