0

I have a file that looks like this:

SF:/home/developer/project/test/resources/somefile.js
DA:1,2
DA:3,2
end_of_record
SF:/home/developer/project/src/resources/otherfile.js
DA:9,2
DA:15,2
DA:22,2
end_of_record

...some more SF:/home/xxx and end_of_record lines...

The file consists of blocks beginning with SF: ... and ending with end_of_record. Note that the count of the lines inbetween (DA:x,x) can be different. I want to print all blocks that have the String "test" in its first line (like "SF:/home/developer/test/resources/..." here). For this example, my wanted output would be:

SF:/home/developer/project/test/resources/somefile.js
DA:1,2
DA:3,2
end_of_record

I want to do this on a Linux environment.

My first try was to do this using the "sed" command, but after some research it seemed like "awk" is a more suitable tool for doing multiline operations.

Using awk and Regex, this is the command that I have so far:

awk '/SF[:\/a-zA-Z0-9]*test[\/A-Za-z0-9.,:\n]*end_of_record/ {print}' FS="\n" RS="" examplefile

But it outputs the full examplefile, not only the blocks containing "test" in the first line. I am not sure if my Regex is wrong or if I am missing something in my awk call.

How can I get only the block with "test" in the first line?

Uooo
  • 6,204
  • 8
  • 36
  • 63

2 Answers2

3

you need a flag:

awk '/^SF.*test.*/{f=1}f;/end_of_record/{f=0}' yourFile
Kent
  • 189,393
  • 32
  • 233
  • 301
1
awk '{if($0~/SF:.*\/test\//){P=1;}if($0~/end_of_record/&& P==1){print;P=0;}if(P==1)print}' your_file
Vijay
  • 65,327
  • 90
  • 227
  • 319