2010-08-10 54 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=' 
相關問題