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
, tail
ou alguma combinação dos dois para obter apenas um resultado. Se você quer apenas o primeiro resultado, head -1
faça isso. Se você estiver procurando por um número de linha específico, provavelmente será necessária uma combinação de head
e .tail
Responder2
Se você quiser o primeiro valor retornado, poderá usá -lo |head -1
para 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
-r
para regex
-n
para suprimir a impressão automática
/PORT/
para encontrar a linha contendo PORT
s/
para substituir
/p
para 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