Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Perl > Perl Misc > How Do I Locate a value in a text file and evaluate it and then writeout that line based on the value?

Reply
Thread Tools

How Do I Locate a value in a text file and evaluate it and then writeout that line based on the value?

 
 
kwalike57
Guest
Posts: n/a
 
      12-28-2007
Hello.

I need to use Perl to read through log output from a df -k command on
a Unix server, for each line in the log where the value for %Used is
greater than 60% I need to write that line of the log out to another
text file. The header %Used is located on the line above the actual
value, like this:

%Used
60%

How would I capture and evaluate only the %Used value and no other
values in that line?

The 60% occurs first in the value line followed by a percent value for
inodes used.

Thanks for your help.

Karin Walike
 
Reply With Quote
 
 
 
 
Jürgen Exner
Guest
Posts: n/a
 
      12-28-2007
On kwalike57 <(E-Mail Removed)> wrote:
>I need to use Perl to read through log output from a df -k command on
>a Unix server, for each line in the log where the value for %Used is
>greater than 60% I need to write that line of the log out to another
>text file. The header %Used is located on the line above the actual
>value, like this:
>
>%Used
>60%


Where's the problem? Loop through the file using a standard while(){}.
When you find a line with a content that is eq()ual to '%Used' then read the
next line and check if the value is > 60.

>How would I capture and evaluate only the %Used value and no other
>values in that line?


That depends on what that line actually contains.
Standard answer: if you know the separator between values, then use split(),
if you know the value then use m/(...)/.

It is impossible to give more detailed suggestions without seeing the actual
data.

>The 60% occurs first in the value line followed by a percent value for
>inodes used.


That is nice, but a vague verbal description of the data can only result in
a vague verbal description of the algorithm.

jue
 
Reply With Quote
 
 
 
 
John W. Krahn
Guest
Posts: n/a
 
      12-28-2007
kwalike57 wrote:
>
> I need to use Perl to read through log output from a df -k command on
> a Unix server, for each line in the log where the value for %Used is
> greater than 60% I need to write that line of the log out to another
> text file. The header %Used is located on the line above the actual
> value, like this:
>
> %Used
> 60%
>
> How would I capture and evaluate only the %Used value and no other
> values in that line?
>
> The 60% occurs first in the value line followed by a percent value for
> inodes used.



open my $ph, '-|', 'df', '-k' or die "Cannot open pipe from 'df' $!";

<$ph> =~ /%used?\b|\bused?%/i and my $pos = $-[0];

/\A.{$pos}\s*(\d+)/ && $1 > 60 && print while <$ph>;

close $ph or warn $! ? "Error closing 'df' pipe: $!"
: "Exit status $? from 'df'";




John
--
Perl isn't a toolbox, but a small machine shop where you
can special-order certain sorts of tools at low cost and
in short order. -- Larry Wall
 
Reply With Quote
 
nolo contendere
Guest
Posts: n/a
 
      12-28-2007
On Dec 28, 2:06*pm, "John W. Krahn" <(E-Mail Removed)> wrote:
> kwalike57 wrote:
>
> > I need to use Perl to read through log output from a df -k command on
> > a Unix server, for each line in the log where the value for %Used is
> > greater than 60% I need to write that line of the log out to another
> > text file. *The header %Used is located on the line above the actual
> > value, like this:

>
> > %Used
> > 60%

>
> > How would I capture and evaluate only the %Used value and no other
> > values in that line?

>
> > The 60% occurs first in the value line followed by a percent value for
> > inodes used.

>
> open my $ph, '-|', 'df', '-k' or die "Cannot open pipe from 'df' $!";
>
> <$ph> =~ /%used?\b|\bused?%/i and my $pos = $-[0];
>
> /\A.{$pos}\s*(\d+)/ && $1 > 60 && print while <$ph>;
>
> close $ph or warn $! ? "Error closing 'df' pipe: $!"
> * * * * * * * * * * * : "Exit status $? from 'df'";
>


That's pretty nifty (no sarcasm intended). However, have you tried
it?
I don't get what I expect. Perhaps the issues are on my end though...

bash-2.03$ ./df.pl
df: cannot statvfs /foswbdmmk1/install: Permission denied
df: cannot statvfs /foswbdmmk1/admin: Permission denied
df: cannot statvfs /foswbdmmk1/was: Permission denied
df: cannot statvfs /foswbdmmk1/stag: Permission denied
df: cannot statvfs /foswbdmmk1/prev: Permission denied
df: cannot statvfs /foswbdmmk1/log: Permission denied
df: cannot statvfs /foswbdmmk1/ihs: Permission deniedUse of
uninitialized value in concatenation (.) or string at ./df.pl line 10,
<$ph> line 2.

df: cannot statvfs /foswbdmmk1/app: Permission denied
Use of uninitialized value in concatenation (.) or string at ./df.pl
line 10, <$ph> line 3.
Use of uninitialized value in concatenation (.) or string at ./df.pl
line 10, <$ph> line 4.
Use of uninitialized value in concatenation (.) or string at ./df.pl
line 10, <$ph> line 5.
Use of uninitialized value in concatenation (.) or string at ./df.pl
line 10, <$ph> line 6.
Use of uninitialized value in concatenation (.) or string at ./df.pl
line 10, <$ph> line 7.
Use of uninitialized value in concatenation (.) or string at ./df.pl
line 10, <$ph> line 8.
Use of uninitialized value in concatenation (.) or string at ./df.pl
line 10, <$ph> line 9.
Use of uninitialized value in concatenation (.) or string at ./df.pl
line 10, <$ph> line 10.
Use of uninitialized value in concatenation (.) or string at ./df.pl
line 10, <$ph> line 11.
Use of uninitialized value in concatenation (.) or string at ./df.pl
line 10, <$ph> line 12.
Use of uninitialized value in concatenation (.) or string at ./df.pl
line 10, <$ph> line 13.
Use of uninitialized value in concatenation (.) or string at ./df.pl
line 10, <$ph> line 14.
Use of uninitialized value in concatenation (.) or string at ./df.pl
line 10, <$ph> line 15.
Use of uninitialized value in concatenation (.) or string at ./df.pl
line 10, <$ph> line 16.
Use of uninitialized value in concatenation (.) or string at ./df.pl
line 10, <$ph> line 17.
Use of uninitialized value in concatenation (.) or string at ./df.pl
line 10, <$ph> line 18.
 
Reply With Quote
 
kwalike57
Guest
Posts: n/a
 
      01-02-2008
On Dec 28 2007, 10:48*am, Jürgen Exner <(E-Mail Removed)> wrote:
> On kwalike57 <(E-Mail Removed)> wrote:
> >I need to use Perl to read through log output from a df -k command on
> >a Unix server, for each line in the log where the value for %Used is
> >greater than 60% I need to write that line of the log out to another
> >text file. *The header %Used is located on the line above the actual
> >value, like this:

>
> >%Used
> >60%

>
> Where's the problem? Loop through the file using a standard while(){}.
> When you find a line with a content that is eq()ual to '%Used' then read the
> next line and check if the value is > 60.
>
> >How would I capture and evaluate only the %Used value and no other
> >values in that line?

>
> That depends on what that line actually contains.
> Standard answer: if you know the separator between values, then use split(),
> if you know the value then use m/(...)/.
>
> It is impossible to give more detailed suggestions without seeing the actual
> data.
>
> >The 60% occurs first in the value line followed by a percent value for
> >inodes used.

>
> That is nice, but a vague verbal description of the data can only result in
> a vague verbal description of the algorithm.
>
> jue


Hello.

Thanks for the note.

Here is additional information:

Sample file excerpt...

Filesystem 1024-blocks Free %Used Iused %Iused Mounted on
/dev/hd4 131072 38912 71% 4261 32% /
Filesystem 1024-blocks Free %Used Iused %Iused Mounted on
/dev/inputlv 255328256 118925432 54% 564 1% /IPW/input

From this example, I want to evaluate the column labeled %Used for
values greater than 60% and if that value is greater than 60%, I then
want to write that entire line, (/dev/hd4 131072 38912
71% 4261 32% /
) out to a text file that will be emailed out to report on filesystems
that are now at a capacity of 60% or greater.

I already have the script written to create the original df -k output
to a text file and create the email generation. I just need to have
help evaluating the correct values in the original df -k output file
and then creating the new file containing entries of all filesystems
that are at or above 60% capacity.

Does this help clarify my question?

Thanks again,

Karin Walike
 
Reply With Quote
 
kwalike57
Guest
Posts: n/a
 
      01-02-2008
On Dec 28 2007, 11:06*am, "John W. Krahn" <(E-Mail Removed)> wrote:
> kwalike57 wrote:
>
> > I need to use Perl to read through log output from a df -k command on
> > a Unix server, for each line in the log where the value for %Used is
> > greater than 60% I need to write that line of the log out to another
> > text file. *The header %Used is located on the line above the actual
> > value, like this:

>
> > %Used
> > 60%

>
> > How would I capture and evaluate only the %Used value and no other
> > values in that line?

>
> > The 60% occurs first in the value line followed by a percent value for
> > inodes used.

>
> open my $ph, '-|', 'df', '-k' or die "Cannot open pipe from 'df' $!";
>
> <$ph> =~ /%used?\b|\bused?%/i and my $pos = $-[0];
>
> /\A.{$pos}\s*(\d+)/ && $1 > 60 && print while <$ph>;
>
> close $ph or warn $! ? "Error closing 'df' pipe: $!"
> * * * * * * * * * * * : "Exit status $? from 'df'";
>
> John
> --
> Perl isn't a toolbox, but a small machine shop where you
> can special-order certain sorts of tools at low cost and
> in short order. * * * * * * * * * * * * * *-- Larry Wall- Hide quoted text -
>
> - Show quoted text -


Hello.

Thanks for the note.

Here is additional information:

Sample file excerpt...

Filesystem 1024-blocks Free %Used Iused %Iused Mounted on
/dev/hd4 131072 38912 71% 4261 32% /
Filesystem 1024-blocks Free %Used Iused %Iused Mounted on
/dev/inputlv 255328256 118925432 54% 564 1% /IPW/input

From this example, I want to evaluate the column labeled %Used for
values greater than 60% and if that value is greater than 60%, I then
want to write that entire line, (/dev/hd4 131072 38912
71% 4261 32% /
) out to a text file that will be emailed out to report on filesystems
that are now at a capacity of 60% or greater.

I already have the script written to create the original df -k output
to a text file and create the email generation. I just need to have
help evaluating the correct values in the original df -k output file
and then creating the new file containing entries of all filesystems
that are at or above 60% capacity.

Does this help clarify my question?

Thanks again,

Karin Walike
 
Reply With Quote
 
Tad J McClellan
Guest
Posts: n/a
 
      01-03-2008
kwalike57 <(E-Mail Removed)> wrote:

> I need to use Perl to read through log output from a df -k command on
> a Unix server, for each line in the log where the value for %Used is
> greater than 60% I need to write that line of the log out to another
> text file.


> How would I capture and evaluate only the %Used value and no other
> values in that line?



Match the first run of digits that is followed by a percent sign.


-------------------
#!/usr/bin/perl
use warnings;
use strict;

foreach ( qx/df -k/ ) {
print if /(\d+)%/ and $1 >= 60;
}
-------------------


--
Tad McClellan
email: perl -le "print scalar reverse qq/moc.noitatibaher\100cmdat/"
 
Reply With Quote
 
Jürgen Exner
Guest
Posts: n/a
 
      01-03-2008
kwalike57 <(E-Mail Removed)> wrote:
>Filesystem 1024-blocks Free %Used Iused %Iused Mounted on
>/dev/hd4 131072 38912 71% 4261 32% /
>Filesystem 1024-blocks Free %Used Iused %Iused Mounted on
>/dev/inputlv 255328256 118925432 54% 564 1% /IPW/input
>
>From this example, I want to evaluate the column labeled %Used for


Ok, that would be the fourth column.

>values greater than 60% and if that value is greater than 60%, I then
>want to write that entire line, (/dev/hd4 131072 38912
>71% 4261 32% /


Assuming the the data is stored in @t:

for (@t) {
print if ((split)[3] >= 60);
}

Note: this is not warning safe, so you will have to disable warnings for
this line.

>) out to a text file that will be emailed out to report on filesystems
>that are now at a capacity of 60% or greater.


Above you wrote greater than 60% and here 60% or greater. Which one is it?

>I already have the script written to create the original df -k output
>to a text file and create the email generation.


Why writing the df output to a file instead of storing it in an array? That
output can't be that large.
Anyway, if you want to use that temporary file and process it line by line
instead (which IMO is totally unnecessary in this case) then use the
standard
while(<FILE>)
loop instead of the for() loop.

jue
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
problem in running a basic code in python 3.3.0 that includes HTML file Satabdi Mukherjee Python 1 04-04-2013 07:48 PM
Read a file line by line and write each line to a file based on the5th byte scad C++ 23 05-17-2009 06:11 PM
How to read a text file line by line and remove some line kaushikshome C++ 4 09-10-2006 10:12 PM
Help. SessionID is x then y then x then y BodiKlamph@gmail.com ASP General 0 09-03-2005 03:02 PM



Advertisments