user704488
user704488

Reputation: 1

Reading between the lines (perl or awk)

Hey all, sorry for posting this here I could not find an answer anywhere and my solution is not working. I have a log file being written in the following fashion (don't ask):

=============================

04-12-2011 11:37:10 SOMETHING_GOES_HERE

Variable1

Something Goes Here

=============================

04-12-2011 11:37:20 SOMETHING_GOES_HERE

Variable2

Anything different may be here

=============================

04-12-2011 11:37:30 SOMETHING_GOES_HERE

Variable3

is altogether different here

=============================

What I'd like to do (either in perl or awk as this is an RTOS) is:

Take a look at the file, if Variable1 exists, then start at Variable2 and print everything between the equal signs:

E.g.

=============================
04-12-2011 11:37:10 SOMETHING_GOES_HERE

Variable1

Mary had a little lamb

=============================
04-12-2011 11:37:20 SOMETHING_GOES_HERE

Variable2

The cow jumped over the moon
=============================

awk '/Mary had/{getline;getline;getline;print}'

will only print

04-12-2011 11:37:20 SOMETHING_GOES_HERE 

but what I need is everything between the equal signs. I tried butchering up a perl script which isn't working either. Any thoughts?


Alright, this worked (sort of)

#!perl -w
use strict;

my $LOGFILE = "/home/mydir/MyTestFile";
open my $fh, "<$LOGFILE" or die("could not open log file: $!");
my $in = 0;

while(<$fh>)
{
    $in = 1 if /Variable1/i;
    print if($in);
    $in = 0 if /Variable2/i;
}

In the sense that a lot was stripped out. Now another q I have is selective printing a-la awk. Typically, I can get the line before something using:

echo "
test
hello
foo
bar" | awk '/foo/{print x};{x=$0}'

Will print test, however haven't found a way to get the word test (will always be a different word, but the word foo will always remain). Any takers (by the way many thanks in advance)

Upvotes: 0

Views: 270

Answers (2)

ikegami
ikegami

Reputation: 386386

local $/ = "\n=============================\n";
while (<>) {
   chomp;
   ...
}

Alternative:

my $rec = '';
while (<>) {
   if (!/^=============================$/) {
      $rec .= $_;
      next;
   }

   ...

   $rec = '';
}

$/, chomp

Upvotes: 1

drysdam
drysdam

Reputation: 8637

I'm not totally clear on if "Variable1/2" etc are constant strings or actually varying quanitites, but does this work:

if [ $(grep Variable1 $file | wc -l) -gt 0 ]; then
  sed -n '/Variable2/,/=======/' $file
fi

Upvotes: 0

Related Questions