2010-08-10 2 views
2

특정 패턴과 가장 가까운 패턴을 찾고 싶습니다. 예를 들어 "yyyy :"("bbb = ~ yyyy"와 가장 가까운 행) 아래에 "bbb ="를 인쇄하려고합니다. 줄 번호는 줄 번호와 순서가 변경 될 수 있으므로 줄 번호를 사용하지 않는 것이 좋습니다.특정 패턴의 다른 라인에 가장 가까운 패턴의 라인을 인쇄하는 방법은 무엇입니까?

루트 # vi를
"는"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 또는 그렙를 사용하여 아이디어를 가지고 있습니까?

+0

"가장 가까운 패턴"이 의미하는 것의 _clear_ 아이디어가 없으면 이것은 실제로 질문이 아닙니다 ... – vonbrand

답변

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=' 
관련 문제