2017-05-08 1 views
1

로그 판독기, 최초 포스터. 죄송합니다. 자세한 설명을 부탁 드리겠습니다.파일에서 문자열을 검색 한 다음 다른 문자열과 일치하는 이전 행을 찾으십시오.

사용 가능한 Linux 도구 (예 : sed, awk, grep 등)를 사용하여 구문 분석하려는 일부 하드웨어 부하 분산 장치 구성이 있습니다.

address 10.1.104.164이라는 문구를 검색하고 그 내부에있는 풀을 알고 싶습니다. 우리가 10.1.104.164 검색 예를 들어 나는 돌아가 그것을 좋아하는 것 : 크리스

편집 사전에

ltm pool pool_10.1.105.30_80 { 
    load-balancing-mode observed-member 
    members { 
     node_10.1.104.163:http { 
      address 10.1.104.163 
      session monitor-enabled 
      state up 
     } 
     node_10.1.104.164:http { 
      address 10.1.104.164 
      session monitor-enabled 
      state up 
     } 
    } 
    monitor http_200_OK 
} 
ltm pool pool_10.1.105.31_80 { 
    load-balancing-mode observed-member 
    members { 
     node_10.1.104.163:http { 
      address 10.1.104.163 
      session monitor-enabled 
      state up 
     } 
     node_10.1.104.164:http { 
      address 10.1.104.164 
      session monitor-enabled 
      state up 
     } 
    } 
    monitor http_200_OK 
} 

감사합니다, 다음은

ltm pool pool_10.1.105.30_80 
ltm pool pool_10.1.105.31_80 

내가 검색하고 파일의 샘플입니다 : 철자 및 서식 지정. perl

답변

1
$ awk -v tgt="address 10.1.104.164" ' 
    /^ltm pool/ { pool=$0; sub(/ *{ *$/,"",pool) } 
    index($0" ",tgt" ") { print pool } 
' file 
ltm pool pool_10.1.105.30_80 
ltm pool pool_10.1.105.31_80 
+1

이 더 낫다. – dawg

+0

감사합니다. 그러나 주소 행이 "address 10.1.104.16"이라고 가정하자.이 awk 명령을 실행하면 10.1.104.16과 10.1.104.164가 일치하지 않아 잘못된 결과가 나타납니다. 필자는 tgt = "address 10.1.104.164"와 같이 라인 식별자의 끝을 tgt = "address 10.1.104.164 $"와 같이 설정해야한다고 생각합니다. 그러나 이것은 올바른 구문이 아닙니다. –

+0

나는 그것을 고치기 위해 스크립트를 수정했다. 미래의 질문을 위해 - 샘플 입력/출력을 게시 할 때 생각을 넣고 처음 질문을 게시 할 때 언급 한 것과 같은 경우를 생각해 내면 도움이 될 때 고려할 수 있습니다. 솔루션을 나중에 발견하고 디버깅하는 대신 –

0

:

$ perl -0777 -lne 'while (/^(ltm pool pool_[\d._]+)(.*?)(?=^\})/gms){ 
         $m=$1; $t=$2; 
         print "$m\n" if ($t =~ /address 10\.1\.104\.164/)}' file 
ltm pool pool_10.1.105.30_80 
ltm pool pool_10.1.105.31_80