산출

산출

다음 내용이 포함된 tnsnames.ora 파일이 있습니다.

NEWDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = linuxerp.de.mph.com)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = linuxerp.de.mph.com)(PORT = 1550))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = newdb)
    )
  )

LISTENER_DG11G =
  (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = linuxerp.de.mph.com)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = linuxerp.de.mph.com)(PORT = 1550))
  )

LISTENER_SABDB =
  (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = linuxerp.de.mph.com)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = linuxerp.de.mph.com)(PORT = 1550))
  )

STEST =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = linuxerp.de.mph.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = STEST)
    )
  )

RBSDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = linuxerp.de.mph.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = RBSDB)
     )
    )

위 파일에는 NEWDB = LISTENER_DG11G = LISTENER_SABDB = STEST = RBSDB =데이터베이스 이름과 해당 서비스 이름이 포함되어 있습니다.SERVICE_NAME =

그래서 위 파일에서 데이터베이스 이름과 해당 서비스 이름을 추출하여 Linux의 .xls 파일에 넣어 보았습니다.

출력 파일은 다음과 같아야합니다

NEWDB   newdb
STEST   STEST
RBSDB   RBSDB

서비스 이름이 없는 모든 데이터베이스는 출력 파일에 추가하면 안 됩니다.

첫 번째 행 세트를 사용하여 CSPLIT"X" 파일로 이동한 다음 첫 번째 행과 SERVICE_NAME을 선택하여 cat X | grep -i "SERVICE_NAME" | cut -d "=" -f2 | rev | cut -d ")" -f2 | rev | awk "NF" 이를 파일로 이동하고 동일한 방식으로 나머지 데이터베이스 이름에 추가해 보았습니다.

그런데 너무 복잡해 보이네요. 이를 수행하는 방법에 대한 다른 아이디어가 있으면 크게 감사하겠습니다.

답변1

이 문제를 처리하는 더 좋은 방법이 있다고 확신하지만 이 awk스크립트 쌍이 해당 작업을 수행합니다. 확대된 주석 버전 또는 아래의 한 줄 텍스트를 사용할 수 있으며 기능적으로 동일합니다.

awk '
    BEGIN { RS="" }                             # Slurp paragraphs
    { print gensub("\n", " ", "g") }            # Replace NL with SPACE
' /tmp/tnsnames.ora |                           # ...in this file

awk '
    /SERVICE_NAME/ {                            # Only process matching lines
        listener=$1;                            # Listener is the first field
        si=NF-2;                                # Count fields back from end of string
        service=gensub(")", "", 1, $si);        # Strip trailing ")"
        printf "%s\t%s\n", listener, service    # Output result
    }
'

샘플 실행

awk 'BEGIN { RS="" } { print gensub("\n", " ", "g") }' /tmp/tnsnames.ora | awk '/SERVICE_NAME/ { listener=$1; si=NF-2; service=gensub(")", "", 1, $si);  printf "%s\t%s\n", listener, service }'
NEWDB   newdb
STEST   STEST
RBSDB   RBSDB

답변2

perl -l -00ne '
my ($blk) = /^\w+/g;

$np = qr/
   \(              # match an opening paren
     (?:
      (?> [^)(]+ ) # one or more non paren, non backtracking
           |
      (??{ $np })  # recurse for more
     )*
   \)              # match a closing paren
/x;

1 while
   /$np
     (?{
        m{ \( CONNECT_DATA \s+ = (?:\s*$np\s*)+ \) }x and
        m{ \( SERVICE_NAME \s+ = \s+ (\w+)      \) }x and
           print join $", $blk, $1 for $&;
     })
   /gx;
' input_file

산출

NEWDB newdb
STEST STEST
RBSDB RBSDB

관련 정보