Retorne um valor e salve-o em uma variável

Retorne um valor e salve-o em uma variável

Eu tenho esta frase que retorna dois valores.

cat /ora$sid/dbs/listener.ora|grep PORT|sed 's/.*PORT.*\([0-9]\{4\}\)\(.*\)/\1/'

Return
1521
1522

Com esta frase quero obter apenas um valor. Quero salvá-lo em uma variável para construir uma string sqlplus para conectar-se automaticamente ao banco de dados Oracle e então executar um comando.

Como posso limitar o número de resultados retornados e salvá-los em uma variável para posteriormente usar esse valor em outro comando?

Atualizar:

Eu adicionei a frase em uma chamada ssh, mas quando a executo não obtenho nenhum valor (sem a chamada ssh funciona bem com head -1)

read -p "Maquina : " maquina; read -p "SID : " sid; ssh ora$sid@`echo $maquina` "port=$(cat /ora$sid/dbs/listener.ora|grep PORT|sed 's/.*PORT.*\([0-9]\{4\}\)\(.*\)/\1/ ' | head -1)| echo $port"

Responder1

Dada a maneira como você construiu o comando, a recomendação seria usar head, tailou alguma combinação dos dois para obter apenas um resultado. Se você quer apenas o primeiro resultado, head -1faça isso. Se você estiver procurando por um número de linha específico, provavelmente será necessária uma combinação de heade .tail

Responder2

Se você quiser o primeiro valor retornado, poderá usá -lo |head -1para obtê-lo.

Você pode então usar a $()estrutura para retorná-lo como um valor, por exemplo

port=$(cat /ora$sid/dbs/listener.ora|grep PORT|sed 's/.*PORT.*\([0-9]\{4\}\)\(.*\)/\1/' | head -1)

Responder3

São muitos comandos fazendo as mesmas coisas que apenas um comando poderia fazer.

Não sei como "listener.ora" está formatado, mas a linha abaixo deve funcionar bem, no máximo com alguns pequenos ajustes.

sed -rn '/PORT/ s/.*([0-9]{4}).*/\1/p' /ora$sid/dbs/listener.ora

-rpara regex
-npara suprimir a impressão automática
/PORT/para encontrar a linha contendo PORT
s/para substituir
/ppara imprimir as linhas editadas

Use head ou tail para obter um ou outro valor.

$PORT0=(sed -rn '/PORT/ s/.*([0-9]{4}).*/\1/p' /ora$sid/dbs/listener.ora | head -1)

Ou se você quiser os dois:

grab_port () { sed -rn '/PORT/ s/.*([0-9]{4}).*/\1/p' /ora$sid/dbs/listener.ora ; }
$PORT0=$(grab_port|head -1)
$PORT1=$(grab_port|tail -1)

Agora, vamos dar uma olhada em sua linha:

leia -p "Máquina:" maquina; leia -p "SID:" sid; ssh ora$sid@`echo $maquina` "port=$(cat /ora$sid/dbs/listener.ora|grep PORT|sed 's/.*PORT.*\([0-9]\{4\ }\)\(.*\)/\1/ ' | head -1)| echo $porta"

A parte que começa com "port=termina com | echo $port", canalizando o resultado de sua própria variável para si mesma... não é o que você deseja fazer aqui. Edit: Sem falar que nem está rodando o comando ou fazendo a variável. Simplesmente não foi construído corretamente.

Se você definir a variável port antes, também ficará mais fácil.

leia -p "Máquina:" maquina; leia -p "SID:" sid; ssh ora$sid@`echo $maquina` "$PORT0"

Responder4

grep -m1 PORT /ora$sid/dbs/listener.ora | sed 's/.*PORT.*\([0-9]\{4\}\)\(.*\)/\1/'

ou

Altere if($count > NUM) para restringir o número de correspondências retornadas, aqui são 3 correspondências.

perl -e 'my $count = 0; while(<>) { if(/PORT (\d+)/) {print "$1\n"; $count+=1; if($count > 2) {exit}} }' /ora$sid/dbs/listener.ora

informação relacionada