Perl script


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Perl script
# 1  
Old 10-01-2003
Perl script

Hi,

I am currently working on a perl script for my collegues that produces an output like this :

Directory /orapkg/ora002/oradata/aora02 has size 134 Mb
Directory /orapkg/ora002/oradata has size 20560 Mb
Directory /orapkg/ora002/oradata/aora01 has size 2038 Mb

Now I would like to have the size sorted on the right. The script is as follows :

sub wanted {
$dir = "$File::Find::dir";

unless ($seen{$dir}++) {
next if ( $dir =~ "lost+found" );
$dm=`du -ks $dir`;
($kb, $path) = split /\s+/, $dm ;
$mb = int( $kb / 1024 );
print "Directory $path has size\t $mb Mb\n";
}
}

I do not know exact how to do this, and it's a while ago since I did my last programming. Anyone an idea, maybe puting this into a hash and later on get the longest value would be the solution. Only I do not understand the work of hashes anymore. Can anyone assist?

I will put my complete script below for the overview. Unfortunetly I do not have File::Find::Rule so please no advise on that Smilie. Any other remarks are more than welcome.

Regs David


#!/opt/perl/bin/perl

use File::Find;

# Determine wether argument is given or not
if (@ARGV[0]) {
$directory = "@ARGV[0]";
}
else {
usage();
}

# Searching starting at your given directory
finddepth(\&wanted, $directory);

# If this dir is unique, start getting total disk usage inclusive sub-dirs
%seen = ();
$total = ();
sub wanted {
$dir = "$File::Find::dir";

unless ($seen{$dir}++) {
next if ( $dir =~ "lost+found" );
$dm=`du -ks $dir`;
($kb, $path) = split /\s+/, $dm ;
$mb = int( $kb / 1024 );
print "Directory $path has size\t $mb Mb\n";
}
}

$total=`du -ks $directory`;
($total_size, $useless) = split /\s+/, $total;
$total_size_mb = int( $total_size / 1024 );
print "\nTotal usage of $directory is $total_size_mb Mb\n\n";

sub usage() {
print "\ndirinfo.pl: Error incorrect usage \n\n";
print "Usage: /usr/local/bin/dirinfo.pl <directory> \n";
print "\t <directory> Is directory start point to check \n\n\n";
exit 1;
}
# 2  
Old 10-02-2003
This seems to be a more difficult problem than it appears to be. I have thought about using a hash but I believe it does not work. Thanks to the flexibility of Perl, you may try to do it like this:

Code:
#!/usr/bin/perl -w

@list = (
	[123, '/home/abc'],
	[7123, '/home/def'],
	[200, '/home/ghi'],
	[1234, '/home/jki'],
);

@sortedlist = sort { $$b[0] <=> $$a[0] } @list;
foreach (@sortedlist) {
	print $$_[1], "\t", $$_[0], "\n";
}

Output:

/home/def 7123
/home/jki 1234
/home/ghi 200
/home/abc 123

I have no time to examine your code in detail, but I think you can adapt my code in your program very easily.
# 3  
Old 10-02-2003
Hi,

I found a bad solution, but it is a solution Smilie

sub wanted {
$dir = "$File::Find::dir";

unless ($seen{$dir}++) {
next if ( $dir =~ "lost+found" );
$dm=`du -ks $dir`;
($kb, $path) = split /\s+/, $dm ;
$mb = int( $kb / 1024 );

if ( length($path) < 9) {
print "Directory $path has \t\t\t\t\t\t $mb MB \n";
}
elsif ( length($path) < 17 ) {
print "Directory $path has \t\t\t\t\t $mb MB \n";
}
elsif ( length($path) < 25 ) {
print "Directory $path has \t\t\t\t $mb MB \n";
}
elsif ( length($path) < 33 ) {
print "Directory $path has \t\t\t $mb MB \n";
}
elsif ( length($path) < 41 ) {
print "Directory $path has \t\t $mb MB \n";
}
elsif ( length($path) < 49 ) {
print "Directory $path has \t $mb MB \n";
}
else {
print "Directory $path has $mb MB \n";
}

}
}
# 4  
Old 10-02-2003
Looks awful though. Smilie

I think you would better use the sort() function if you really are to sort something. If you need to introduce spacing really neatly and reliably, sprintf is the only function I would recommend.
# 5  
Old 10-21-2003
there are alot of way to do your formating.
this is an example from learning perl. useing Formats.

but w/o keeping it KISS i would just use the sprintf function to do your basic formating and it will still look pretty.


Code:
#! /usr/bin/perl -w

format STDOUT =
=================================
| @||||||||||||||||||||||||     |
$uname
| @||||||||||||||||||||||||     |
$uid
| @||||||||||||||||||||||||     |
$real_name
=================================
.

open(PASSFILE, "/etc/passwd") || die "Can not open password file";

while (<PASSFILE>) {
($uname, $uid, $real_name)=(split /:/)[0,2,4];
write ;
}

# 6  
Old 10-21-2003
You can probably write out to a file and do a sort on it.

cat file | sort --field-separator=" " -n -k 5.5

Is this an acceptable solution to you?
# 7  
Old 10-22-2003
Quote:
Originally posted by csejl
You can probably write out to a file and do a sort on it.

cat file | sort --field-separator=" " -n -k 5.5

Is this an acceptable solution to you?
thats alot of work exspecially if you are writeing a script to do it in the first place.

there are plenty of ways to do what he need in his script w/o going to a manual process.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

PERL: In a perl-scripttTrying to execute another perl-script that SETS SOME VARIABLES !

I have reviewed many examples on-line about running another process (either PERL or shell command or a program), but do not find any usefull for my needs way. (Reviewed and not useful the system(), 'back ticks', exec() and open()) I would like to run another PERL-script from first one, not... (1 Reply)
Discussion started by: alex_5161
1 Replies

2. Shell Programming and Scripting

Excuting perl script from within a perl script with variables.

Not sure what I am doing wrong here, but I can print the list with no issue. Just a blank screen with the 'do'. #!/usr/bin/perl open FILE, "upslist.txt"; while ($line=<FILE>){ if ($line=~/^(.*?),(.*?)$/){ #print "ups:$1 string:$2\n"; do 'check_snmp_mgeups-0.1.pl -H $1 -C $2'; } ... (1 Reply)
Discussion started by: mrlayance
1 Replies

3. Shell Programming and Scripting

Perl : embedding java script with cgi perl script

Hi All, I am aware that html tags can be embedded in cgi script as below.. In the same way is it possible to embed the below javascript in perl cgi script ?? print("<form action="action.htm" method="post" onSubmit="return submitForm(this.Submitbutton)">"); print("<input type = "text"... (1 Reply)
Discussion started by: scriptscript
1 Replies

4. Shell Programming and Scripting

executing perl script from another perl script : NOT WORKING

Hi Folks, I have 2 perl scripts and I need to execute 2nd perl script from the 1st perl script in WINDOWS. In the 1st perl script that I had, I am calling the 2nd script main.pl =========== print "This is my main script\n"; `perl C:\\Users\\sripathg\\Desktop\\scripts\\hi.pl`; ... (3 Replies)
Discussion started by: giridhar276
3 Replies

5. Shell Programming and Scripting

calling a perl script with arguments from a parent perl script

I am trying to run a perl script which needs input arguments from a parent perl script, but doesn't seem to work. Appreciate your help in this regard. From parent.pl $input1=123; $input2=abc; I tried calling it with system("/usr/bin/perl child.pl $input1 $input2"); and `perl... (1 Reply)
Discussion started by: grajp002
1 Replies

6. Shell Programming and Scripting

HELP on Perl array / sorting - trying to convert Korn Shell Script to Perl

Hi all, Not sure if this should be in the programming forum, but I believe it will get more response under the Shell Programming and Scripting FORUM. Am trying to write a customized df script in Perl and need some help with regards to using arrays and file handlers. At the moment am... (3 Replies)
Discussion started by: newbie_01
3 Replies

7. Shell Programming and Scripting

Perl :How to print the o/p of a Perl script on console and redirecting same in log file @ same time.

How can i print the output of a perl script on a unix console and redirect the same in a log file under same directory simultaneously ? Like in Shell script, we use tee, is there anything in Perl or any other option ? (2 Replies)
Discussion started by: butterfly20
2 Replies

8. Shell Programming and Scripting

perl/unix: script in command line works but not in perl

so in unix this command works works and shows me a list of directories find . -name \*.xls -exec dirname {} \; | sort -u | > list.txt but when i try running a perl script to run this command my $query = 'find . -name \*.xls -exec dirname {} \; | sort -u | > list.txt';... (2 Replies)
Discussion started by: kpddong
2 Replies

9. Shell Programming and Scripting

[Perl] Accessing array elements within a sed command in Perl script

I am trying to use a script to replace the header of each file, whose filename are stored within the array $test, using the sed command within a Perl script as follows: $count = 0; while ( $count < $#test ) { `sed -e 's/BIOGRF 321/BIOGRF 332/g' ${test} > 0`; `cat 0 >... (2 Replies)
Discussion started by: userix
2 Replies

10. Shell Programming and Scripting

Perl: Run perl script in the current process

I have a question regarding running perl in the current process. I shall demonstrate with an example. Look at this. sh-2.05b$ pwd /tmp sh-2.05b$ cat test.sh #! /bin/sh cd /etc sh-2.05b$ ./test.sh sh-2.05b$ pwd /tmp sh-2.05b$ . ./test.sh sh-2.05b$ pwd /etc sh-2.05b$ So... (10 Replies)
Discussion started by: vino
10 Replies
Login or Register to Ask a Question