2010-08-10 11 views
2

Je veux trouver un motif qui est le plus proche d'un motif spécifique. Tels que je veux imprimer "bbb =" qui est sous le "yyyy:" (c'est la ligne la plus proche avec bbb = to yyyy). C'est la ligne 8. numéros de ligne et l'ordre pourrait être changé, il est donc préférable de ne pas utiliser les numéros de ligne.Comment imprimer une ligne avec un motif qui est le plus proche d'une autre ligne avec un motif spécifique?

root # vi un
"a" 15 lignes

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 

Avez-vous une idée en utilisant awk ou grep à cette fin?

+0

Sans une idée claire de ce que l'on entend par «motif le plus proche», ce n'est pas vraiment une question ... – vonbrand

Répondre

1

Quelque chose comme ça?

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

Ou une ligne peut-elle également correspondre si oui? Dans ce cas, peut-être:

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

Tenant compte du fait qu'il pourrait ne pas être une entrée précédente ou suivante:

/^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

rapide et sale à l'aide grep:

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