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

Discussion in 'Perl Misc' started by kwalike57, Dec 28, 2007.

  1. kwalike57

    kwalike57 Guest

    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
    kwalike57, Dec 28, 2007
    #1
    1. Advertising

  2. Re: How Do I Locate a value in a text file and evaluate it and then write out that line based on the value?

    On 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%


    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
    Jürgen Exner, Dec 28, 2007
    #2
    1. Advertising

  3. Re: How Do I Locate a value in a text file and evaluate it and thenwrite out that line based on the value?

    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
    John W. Krahn, Dec 28, 2007
    #3
  4. Re: How Do I Locate a value in a text file and evaluate it and thenwrite out that line based on the value?

    On Dec 28, 2:06 pm, "John W. Krahn" <> 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.
    nolo contendere, Dec 28, 2007
    #4
  5. kwalike57

    kwalike57 Guest

    Re: How Do I Locate a value in a text file and evaluate it and thenwrite out that line based on the value?

    On Dec 28 2007, 10:48 am, Jürgen Exner <> wrote:
    > On 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%

    >
    > 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
    kwalike57, Jan 2, 2008
    #5
  6. kwalike57

    kwalike57 Guest

    Re: How Do I Locate a value in a text file and evaluate it and thenwrite out that line based on the value?

    On Dec 28 2007, 11:06 am, "John W. Krahn" <> 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
    kwalike57, Jan 2, 2008
    #6
  7. Re: How Do I Locate a value in a text file and evaluate it and then write out that line based on the value?

    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.


    > 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/"
    Tad J McClellan, Jan 3, 2008
    #7
  8. Re: How Do I Locate a value in a text file and evaluate it and then write out that line based on the value?

    kwalike57 <> 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
    Jürgen Exner, Jan 3, 2008
    #8
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. =?Utf-8?B?Sm9yZ2UgUG9udGU=?=

    Open a JavaScript Window from a Web User Control and return a valu

    =?Utf-8?B?Sm9yZ2UgUG9udGU=?=, Dec 20, 2004, in forum: ASP .Net
    Replies:
    1
    Views:
    3,852
    Karl Seguin
    Dec 20, 2004
  2. scad
    Replies:
    23
    Views:
    1,157
    Alf P. Steinbach
    May 17, 2009
  3. Replies:
    0
    Views:
    270
  4. James
    Replies:
    12
    Views:
    814
    James
    Dec 20, 2004
  5. Charleees
    Replies:
    5
    Views:
    95
    Richard Cornford
    Jun 5, 2006
Loading...

Share This Page