Extrai apenas o nome do serviço e o número da porta do arquivo tnsnames.ora

1

Eu gostaria de fornecer um nome de serviço e obter um número de porta em retorno.

Meu arquivo tnsnames.ora se parece com:

DELUCA =
  (DESCRIPTION =
    (ADDRESS = (COMMUNITY = TCP.world)(PROTOCOL = TCP)(Host = database.example.com.au)(Port = 32001))
    (CONNECT_DATA =
      (SID = D10)
    )
  )

TOTAL =
  (DESCRIPTION =
    (ADDRESS = (COMMUNITY = TCP.world)(PROTOCOL = TCP)(Host = database.example.com.au)(Port = 32002))
    (CONNECT_DATA =
      (SID = D11)
    )
  )
FMAX =
  (DESCRIPTION =
    (ADDRESS = (COMMUNITY = TCP.world)(PROTOCOL = TCP)(Host = database.example.com.au)(Port = 32003))
    (CONNECT_DATA =
      (SID = D12)
    )
  )
    
por Felipe Alvarez 22.06.2015 / 03:49

2 respostas

1

Eu nunca vi uma descrição formal de tnsnames.ora , então estou adivinhando o formato. Aqui está minha tentativa em um script para fazer o que você quer:

#!/bin/bash
HOST=$1
tr '()' '\n\n' < input |
awk 'BEGIN {host=""; port=""}
    /[Hh][Oo][Ss][Tt]/ {host=$3}
    /[Pp][Oo][Rr][Tt]/ {port=$3}
    host && port {
        if (host == "'$HOST'") {print host, port}
        host=""; port=""
    }
'

Isso é o GNU awk em uma instalação razoavelmente atualizada do Arch Linux.

    
por 22.06.2015 / 04:22
1

Usando uma versão grep que suporta PCREs (como, por exemplo, GNU grep ), para listar todas as correspondências:

hostname="database.example.com.au"
< inputfile grep -Po "$hostname\)\(Port = \K[0-9]+"

Para listar apenas a primeira correspondência:

hostname="database.example.com.au"
< inputfile grep -Po -m1 "$hostname\)\(Port = \K[0-9]+"

Usando sed , para listar todas as correspondências:

< inputfile sed -n "s/.*$hostname)(Port = \([0-9][0-9]*\).*//p"

Para listar apenas a primeira correspondência:

< inputfile sed -n "0,/$hostname/{s/.*$hostname)(Port = \([0-9][0-9]*\).*//p}"
    
por 22.06.2015 / 07:39