Print Matching line and nth line from the matched line
In awk, you'd do it as follows
awk '/pattern/{nr[NR]; nr[NR+4]}; NR in nr' file > new_file`
or
awk '/pattern/{print; nr[NR+4]; next}; NR in nr' file > new_file`
Explanation
The first solution finds all lines that match pattern
. When it finds a match it stores the record number (NR
) in the array nr
. It also stores the 4th record from NR
in the same array. This is done by the nr[NR+4]
. Every record (NR
) is then checked to see if it's present in the nr
array, if so the record is printed.
The second solution works essentially the same way, except when it encounters th e pattern
it prints that line, and then stores the 4th record ahead of it in the array nr
, then goes to the next record. Then when awk
encounters this 4th record the NR in nr
block will get executed and print this +4 record there after.
Example
Here's an example data file, sample.txt
.
$ cat sample.txt
1
2
3
4 blah
5
6
7
8
9
10 blah
11
12
13
14
15
16
Using the 1st solution:
$ awk '/blah/{nr[NR]; nr[NR+4]}; NR in nr' sample.txt
4 blah
8
10 blah
14
Using the 2nd solution:
$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt
4 blah
8
10 blah
14
You can try the -A
option with grep
, which specifies how many lines after the matching line should be printed. Couple this with sed
, and you would get the required lines.
grep -A 4 pattern input.txt | sed -e '2,4d'
Using sed
, we delete the from the second line until the fourth.
sed -n 's/^[ \t]*/; /img class=\"devil_icon/,+4 { 3,5d ; p }' input.txt
I'm simply adding a deletion of the appropriate lines, before printing { 3,5d ; p }
.