Euklides
Euklides

Reputation: 584

How to awk pattern over two consecutive lines?

I am trying do something which I guess could be done very easy but I cant seem to find the answer. I want to use awk to pick out lines between two patterns, but I also want the pattern to match two consecutive lines. I have tried to find the solution on the Internet bu perhaps I did not search for the right keywords. An example would better describe this.

Suppose I have the following file called test:

aaaa
bbbb

   SOME CONTENT 1

ddddd    
fffff


aaaa    
cccc

    SOME CONTENT 2

ccccc    
fffff

For example lets say I would like to find "SOME CONTENT 1"

Then I would use awk like this:

  cat test | awk  '/aaa*/ { show=1} show; /fff*/ {show=0}'

But that is not want I want. I want somehow to enter the pattern:

  aaaa*\nbbbb*

And the same for the end pattern. Any suggestions how to do this?

Upvotes: 0

Views: 2404

Answers (3)

I searched for two patterns and checkd that they were consecutive using line numbers, having line numbers lets sed insert a line between them, well after the first line/pattern.

awk '$0 ~ "Encryption" {print NR} $0 ~ "Bit Rates:1" {print NR}' /tmp/mainscan | while read line1; do read line2; echo "$(($line2 - 1)) $line1"; done > /tmp/this



    while read line 
    do 
    pato=$(echo $line | cut -f1 -d' ') 
    patt=$(echo $line | cut -f2 -d' ') 
    if [[ "$pato" = "$patt" ]]; then 
       inspat=$((patt + 1)) 
       sed -i "${inspat}iESSID:##" /tmp/mainscan 
       sed -i 's/##/""/g' /tmp/mainscan 
    fi 
    done < /tmp/this

Upvotes: 0

user000001
user000001

Reputation: 33317

If every record ends with fffff, and GNU awk is available, you could do something like this:

$ awk '/aaa*\nbbbb*/' RS='fffff' file
aaaa
bbbb

   SOME CONTENT 1

ddddd

Or if you want just SOME CONTENT 1 to be visible, you can do:

$ awk -F $'\n' '/aaa*\nbbbb*/{print $4}' RS='fffff' file
   SOME CONTENT 1

Upvotes: 1

Jotne
Jotne

Reputation: 41446

You can use this:

awk  '/aaa*/ {f=1} /bbb*/ && f {show=1} show; /fff*/ {show=f=0}' file
bbbb

   SOME CONTENT 1

ddddd
fffff

If pattern1 is aaa* then set flag f
If pattern2 is bbb* and flag f is true, then set the show flag


If you need to print patter1 the aaa*?

awk  '/aaa*/ {f=$0} /bbb*/ && f {show=1;$0=f RS $0} show; /fff*/ {show=f=0}' file
aaaa
bbbb

   SOME CONTENT 1

ddddd
fffff

Upvotes: 3

Related Questions