2010-08-10 69 views
2

我想找到一个最接近特定模式的模式。例如,我想打印“yyyy:”(它是与bbb = yyyy最接近的一行)下的“bbb =”。它是第8行。行号和顺序可能会改变,所以最好不要使用行号。如何打印最接近具有特定图案的另一条线的图案?

根#六一
“一” 15线

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 

你有没有用awk或者grep的用于此目的的想法?

+0

没有关于“最接近的模式”是什么意思的_clear_想法,这不是一个真正的问题...... – vonbrand 2013-02-01 13:49:14

回答

1

像这样的东西?

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

或者上面的一行也可以匹配吗?在这种情况下,也许是:

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

考虑到有可能不是一个或下一个条目:

/^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) 
} 
0

快速和肮脏的使用grep

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