user3037754
user3037754

Reputation: 13

match a pattern and print nth line if condition matches

My requirement is something like this:

Read File:
If ( line contains /String1/)
{
  Increment cursor by 10 lines;
  If (line contains /String2/ )
  {   print line; }
}

so far I have got:

awk '/String1/{nr[NR]; nr[NR+10]}; NR in nr' file1.log

Result of this should input to:

awk 'match ($0 , /String2/) {print $0}' file1.log

How can I achieve it? Is there a better way? Thanks.

Upvotes: 1

Views: 325

Answers (2)

Ed Morton
Ed Morton

Reputation: 203502

Here's another way to describe your algorithm. Instead of:

If ( line contains /String1/)
{
  Increment cursor by 10 lines;
  If (line contains /String2/ )
  {   print line; }
}

which would require jumping ahead in your input stream somehow, think of it as:

If ( line contains /String2/)
{
  If (line 10 lines previously contained /String1/ )
  {   print line; }
}

which just requires you to re-visit what you already read in:

awk '/String1/{f[NR]} /String2/ && (NR-10) in f' file

Upvotes: 2

chepner
chepner

Reputation: 531165

You are close; you need to set the value of the array element.

awk '/String1/ { linematch[NR+10]=1; } /String2/ && NR in linematch;' file1.log

Each time a line matches String1, you save the record (line) number plus 10. Any time you match String2, check if the current line number is one we are expecting, and if so, print the line.

Upvotes: 2

Related Questions