2009-06-02 4 views
1

sed/awk의 특정 행 범위에서 특정 변수를 추출하려면 어떻게합니까?sed/awk의 행 범위에 대한 작업 수행

예 : I 줄에서 시작이 섹션에서 .tnsnames.ora 에서 호스트와 포트를 exctract 할 105

DB_CONNECTION= 
    (description= 
    (address= 
     (protocol=tcp) 
     (host=127.0.0.1) 
     (port=1234) 
    ) 
     (connect_data= 
     (sid=ABCD) 
     (sdu=4321) 
) 

답변

1

사용 : '105 나오지

, $ < 나오지도 어떤 코드 당신은 당신이 특정 호스트를하려면

'> 여기에 원하는 당신은 같은 것을 할 수있는 포트 :

sed .tnsnames.ora '105,115p'|grep -e 'host=' -e 'port=' 
1

주소 범위를 사용하여 정규식을 적용 할 섹션을 지정할 수 있습니다. 끝선 주소를 그대로두면 (쉼표 유지) 파일 끝과 일치합니다. '-e'를 여러 번 사용하여 여러 표현식을 '연결'할 수도 있습니다. 다음 표현식은 포트와 호스트 값을 표준 출력으로 출력합니다. 일치하는 부분을 인쇄하기 위해 역 참조 (\ 1)를 사용합니다.

sed -n -e '105,115s/(port=\([0-9].*\))/\1/p' -e '105,115s/(host=\([0-9\.].*\))/\1/p' tnsnames.ora 
1

둔한 현장 separater (FS)의 정규 표현을 사용할 수있다.

'$ 0 = $ 2'은 항상 true이므로 자동으로이 스크립트는 $ 2를 출력합니다. 당신이 게시 대답을 해결하기 위해

$ gawk -F'[()]' 'NR>105&&NR<115&&(/host/||/port/)&&$0=$2' .tnsnames.ora 
0

@lk는 :

당신은 C와 같은 AWK 코드를 작성할 수 있지만, 더 간결하게 "패턴 {동작}"쌍으로 표현합니다. 당신이 gawk 또는 nawk있는 경우

는 필드 분리 히로후미 사이토와 같은 ERE

gawk -F'[()=]' ' 
    NR < 105 {next} 
    NR > 115 {exit} 
    $2 == "host" || $2 == "port" { 
     # do stuff with $2 and $3 
     print $2 "=" $3 
    } 
' 
을 말한다