At 09:48 AM 3/29/07 -0700, Wagner, David --- Senior Programmer Analyst --- WGO wrote: >> -----Original Message----- >> From: Karyn Williams [mailto:[EMAIL PROTECTED] >> Sent: Wednesday, March 28, 2007 17:54 >> To: beginners@perl.org >> Subject: RE: Exiting loops >> >> At 04:10 PM 3/28/07 -0700, Wagner, David --- Senior >> Programmer Analyst --- >> WGO wrote: >> > take the o off the /o This is in essence saying you only have to >> >compile this once for the processing going on. Take that off and see >> >what happens. I believe you would use /o if you have regex has no >> >variables which are changing with each iteration. >> > >> > If you have any problems or questions, please let me know. >> > >> >> Looks like that was it. I had added that because I read >> somewhere it was >> supposed to speed up the search. Is there another way to speed it up ? >> > Karyn, The real question is how often are you doing this? How >many users are involved? Would reading the data once and collecting the >info into a hash and then reporting off the hash make sense. You are >going through the file 5 times if you input 5 ids, 10 times if you have >10 ids, etc. > > So step back and look at what is needed and then see if reading >the data once and using a hash or related data field will give you the >boost you need.
It varies greatly. Often one or two. Sometimes 70. The size of the files is fairly substantial: -rw-r--r-- 1 root other 249595095 Sep 1 2006 maillog.200608 I am getting Out of memory errors while running the script. I got them before and was trying to make them go away with the /o. I also added opening and closing the filehandle in each loop to try to fix this. Clearly neither of those ideas worked. I have hashed and slurped files in other scripts. I could try it here and see what happens. >> > >> > Wags ;) >> >David R Wagner >> >Senior Programmer Analyst >> >FedEx Freight >> >1.408.323.4225x2224 TEL >> >1.408.323.4449 FAX >> >http://fedex.com/us >> > >> > >> >> -----Original Message----- >> >> From: Karyn Williams [mailto:[EMAIL PROTECTED] >> >> Sent: Wednesday, March 28, 2007 15:54 >> >> To: beginners@perl.org >> >> Subject: Exiting loops >> >> >> >> I have a sh script as follows. The script worked OK until the >> >> year rolled >> >> over. My (now deleted) simple sh way of figuring the month >> >> and year blew >> >> up. I decided to rewrite the script in perl because of the >> date/time >> >> functions. It takes multiple commandline args (usernames) and >> >> checks for >> >> various information on them. Since the maillogs are so large >> >> I want to exit >> >> the first loop as soon as it is determined that the user has >> >> checked their >> >> mail. >> >> >> >> #!/bin/sh >> >> >> >> ext=`date +%Y%m` >> >> >> >> month1="200702" >> >> month2="200701" >> >> month3="200612" >> >> month4=200611 >> >> month5=200610 >> >> month6=200609 >> >> month7=200608 >> >> >> >> for i in $* ; do >> >> >> >> echo $i >> >> >> >> if test -r /export/home/$i/.forward ; then echo $i >> >> has forward file >> >> ; continue ; >> >> elif [ "`fgrep -c "user=$i" /var/adm/maillog`" -gt >> >> "0" ] ; then >> >> echo $i checked mail month 0 ; continue ; >> >> elif [ "`fgrep -c "user=$i" >> >/export/home/archives/maillog.$month1`" >> >> -gt "0" ] ; then echo $i checked mail month 1 ; continue; >> >> elif [ "`fgrep -c "user=$i" >> >/export/home/archives/maillog.$month2`" >> >> -gt "0" ] ; then echo $i checked mail month 2 ; continue; >> >> elif [ "`fgrep -c "user=$i" >> >/export/home/archives/maillog.$month3`" >> >> -gt "0" ] ; then echo $i checked mail month 3 ; continue; >> >> elif [ "`fgrep -c "user=$i" >> >/export/home/archives/maillog.$month4`" >> >> -gt "0" ] ; then echo $i checked mail month 4 ; continue; >> >> elif [ "`fgrep -c "user=$i" >> >/export/home/archives/maillog.$month5`" >> >> -gt "0" ] ; then echo $i checked mail month 5 ; continue; >> >> elif [ "`fgrep -c "user=$i" >> >/export/home/archives/maillog.$month6`" >> >> -gt "0" ] ; then echo $i checked mail month 6 ; continue; >> >> else echo $i has not checked mail in the last 6 months ; >> >> fi >> >> >> >> echo checking last for 2007 ; last -3 $i >> >> echo checking 2007 dial-up ; fgrep -c P${i} >> >> /var/adm/radacct/pleiades/detail >> >> echo checking for last modified file ; ls -lrt >> >> /export/home/$i | >> >> tail -2 >> >> echo checking for newest file in public_html ; ls -lrt >> >> /export/home/$i/public_html | tail -2 >> >> ls -lsu /export/mail/$i >> >> quota -v $i >> >> finger -m $i >> >> >> >> done >> >> >> >> This is what I have so far in perl: >> >> >> >> # cat tt.pl >> >> #!/usr/bin/perl -w >> >> >> >> use POSIX; >> >> >> >> # Get the current month and year >> >> my ($mon,$year) = (localtime)[4,5]; >> >> >> >> # Seed nmonth >> >> >> >> my @nmonth = (1,1,1,1,$mon,$year,0,0); >> >> >> >> my $sec = 1; >> >> my $min = 1; >> >> my $hour = 1; >> >> my $day = 1; >> >> my $wday = 0; >> >> my $yday = 0; >> >> >> >> # Put the loop here >> >> my $a = 1; >> >> while ($a < 7) { >> >> >> >> my $current = mktime($sec, $min, $hour, $day, $nmonth[4], >> >> $nmonth[5], $wday, $yday); # Make new timestamp for the first >> >> @nmonth = localtime($current); # Make an >> >> array out of the >> >> timestamp to get the month and year >> >> my $ext_mon = ($nmonth[4] + 1); # Pull the >> >> month out of the >> >> array and add 1 to get month number >> >> my $ext_year = ($nmonth[5] + 1900); # Pull the >> >> year and add >> >> 1900 to get the actual year >> >> if ($ext_mon <= 9) { # Make the >> >> month have two >> >> places and write the var $ext >> >> $ext = $ext_year . '0' . $ext_mon; >> >> } >> >> else { >> >> $ext = $ext_year . $ext_mon; >> >> } >> >> >> >> push (@flist, $ext); >> >> $current = $current - 86400; # Subtract one day >> >> from the first >> >> timestamp to get the month before >> >> @nmonth = localtime($current); # Make an >> >> array out of the >> >> new timestamp for the next round >> >> } >> >> continue { >> >> $a++; >> >> } >> >> >> >> # This is the part I am having trouble with : >> >> >> >> foreach $k (@ARGV) { >> >> >> >> if (-e ("/export/home/$k/.forward")) { >> >> print "User $k has a forward file.\n\n" ; next ; >> >> } else { >> >> >> >> open MAILLOG, "/var/adm/maillog" or die "couldn't >> >> open maillog : >> >> $!\n"; >> >> if ($count = grep /user=$k/o, <MAILLOG> ) { >> >> print "$k checked mail $count times in >> >> /var/adm/maillog.\n"; next ; >> >> } else { >> >> close MAILLOG; >> >> >> >> open MAILLOG, >> "/export/home/archives/maillog.$flist[1]" or die >> >> "couldn't open maillog.$flist[1] : $!\n"; >> >> if ($count = grep /user=$k/o, <MAILLOG> ) { >> >> print "$k checked mail $count times in >> >> maillog.$flist[1].\n"; next ; >> >> } else { >> >> close MAILLOG; >> >> >> >> open MAILLOG, >> "/export/home/archives/maillog.$flist[2]" or die >> >> "couldn't open maillog.$flist[2] : $!\n"; >> >> if ( $count = grep /user=$k/o, <MAILLOG> ) { >> >> print "$k checked mail $count times in >> >> maillog.$flist[2].\n"; next ; >> >> } else { >> >> close MAILLOG; >> >> >> >> open MAILLOG, >> "/export/home/archives/maillog.$flist[3]" or die >> >> "couldn't open maillog.$flist[3] : $!\n"; >> >> if ( $count = grep /user=$k/o, <MAILLOG> ) { >> >> print "$k checked mail $count times in >> >> maillog.$flist[3].\n"; next ; >> >> } else { >> >> close MAILLOG; >> >> >> >> open MAILLOG, >> "/export/home/archives/maillog.$flist[4]" or die >> >> "couldn't open maillog.$flist[4] : $!\n"; >> >> if ( $count = grep /user=$k/o, <MAILLOG> ) { >> >> print "$k checked mail $count times in >> >> maillog.$flist[4].\n"; next ; >> >> } else { >> >> close MAILLOG; >> >> >> >> open MAILLOG, >> "/export/home/archives/maillog.$flist[5]" or die >> >> "couldn't open maillog.$flist[5] : $!\n"; >> >> if ( $count = grep /user=$k/o, <MAILLOG> ) { >> >> print "$k checked mail $count times in >> >> maillog.$flist[5].\n"; next ; >> >> } else { >> >> close MAILLOG; print "$k has not checked their mail >> >> in the last 6 >> >> months.\n"; >> >> >> >> } >> >> } >> >> } >> >> } >> >> } >> >> } >> >> >> >> } >> >> } >> >> >> >> >> >> Input and output looks like this: >> >> >> >> # ./tt.pl karyn smurphy root >> >> karyn checked mail 2864 times in /var/adm/maillog. >> >> smurphy checked mail 2864 times in /var/adm/maillog. >> >> root checked mail 2864 times in /var/adm/maillog. >> >> # >> >> >> >> Yes, it goes to the next arg but as you can see, it returns >> >> the same count >> >> for each subsequent arg. >> >> >> >> I feel that my braces are (all/part/some) of the problem, >> but not sure >> >> how/what. Any suggestions would be appreciated. >> >> >> >> >> >> -- >> >> >> >> Karyn Williams >> >> Network Services Manager >> >> California Institute of the Arts >> >> [EMAIL PROTECTED] >> >> http://www.calarts.edu/network >> >> >> >> -- >> >> To unsubscribe, e-mail: [EMAIL PROTECTED] >> >> For additional commands, e-mail: [EMAIL PROTECTED] >> >> http://learn.perl.org/ >> >> >> >> >> >> >> > >> >************************************************************* >> ********* >> >This message contains information that is confidential and >> proprietary to >> FedEx Freight or its affiliates. It is intended only for the >> recipient >> named and for the express purpose(s) described therein. Any >> other use is >> prohibited. >> >************************************************************* >> ********* >> > >> > >> > >> -- >> >> Karyn Williams >> Network Services Manager >> California Institute of the Arts >> [EMAIL PROTECTED] >> http://www.calarts.edu/network >> >> -- >> To unsubscribe, e-mail: [EMAIL PROTECTED] >> For additional commands, e-mail: [EMAIL PROTECTED] >> http://learn.perl.org/ >> >> >> > >-- >To unsubscribe, e-mail: [EMAIL PROTECTED] >For additional commands, e-mail: [EMAIL PROTECTED] >http://learn.perl.org/ > > > > -- Karyn Williams Network Services Manager California Institute of the Arts [EMAIL PROTECTED] http://www.calarts.edu/network -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/