开发者

How to print a line with a pattern which is nearest to another line with a specific pattern?

开发者 https://www.devze.com 2023-01-11 02:52 出处:网络
I want to find a pattern which is nearest to a specific pattern. Such as I want to print \"bbb=\" which is underthe \"yyyy:\" (it is the closest line with bbb= to yyyy). It is line 8. line numbers and

I want to find a pattern which is nearest to a specific pattern. Such as I want to print "bbb=" which is under the "yyyy:" (it is the closest line with bbb= to yyyy). It is line 8. line numbers and the order might be changed so it is better not to use line numbers.

root# vi a

"a" 15 lines

 1  ## xxxx:

 2  aaa=3

 3  bbb=4

 4  ccc=2

 5  ddd=1

 6  ## yyyy:

 7  aaa=1

 8  bbb=0

 9  开发者_高级运维ccc=3

10  ddd=3

11  ## zzzz:

12  aaa=1

13  bbb=1

14  ccc=1

15  ddd=1

Do you have an idea using awk or grep for this purpose?


Something like this?

awk '/^## yyyy:/ { i = 1 }; i && /^bbb=/ { print; exit }'

Or can a line above also match if? In that case, perhaps:

awk '/^bbb=/ && !i { p=NR; s=$0 }; /^bbb=/ && i { print (NR-i < i-p) ? $0 : s; exit }; /^## yyyy:/ { i=NR }'

Taking into account that there might not be a previous or next entry:

/^bbb=/ && !i { p1 = NR; s1 = $0 }
/^bbb=/ &&  i { p2 = NR; s2 = $0; exit }
/^## yyyy:/ { i = NR }
END {
    if (p1 == 0)
        print s2
    else if (p2 == 0)
        print s1
    else
        print (i - p1 < p2 - i ? s1 : s2)
}


Quick and dirty using grep:

grep -A 100 '##yyyy' filename | grep 'bbb='
0

精彩评论

暂无评论...
验证码 换一张
取 消