Devuelve un valor y guárdalo en una variable

Devuelve un valor y guárdalo en una variable

Tengo esta oración que devuelve dos valores.

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

Return
1521
1522

Con esta frase quiero obtener solo un valor. Este valor lo quiero guardar en una variable para construir una cadena sqlplus para conectar automáticamente a la base de datos Oracle y luego ejecutar un comando.

¿Cómo puedo limitar la cantidad de resultados devueltos y guardarlos en una variable para luego usar este valor en otro comando?

Actualizar:

Agregué la oración en una llamada ssh pero cuando la ejecuto no obtengo ningún valor (sin la llamada ssh funciona bien con 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"

Respuesta1

Dada la forma en que construyó el comando, la recomendación sería usar head, tailo alguna combinación de los dos para obtener un solo resultado. Si solo quieres el primer resultado, head -1deberías hacerlo. Si está buscando un número de línea específico, probablemente será necesaria una combinación de heady .tail

Respuesta2

Si desea el primer valor devuelto, puede utilizarlo |head -1para obtenerlo.

Luego puede usar la $()estructura para devolverlo como un valor, por ejemplo

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

Respuesta3

Son muchos comandos que hacen las mismas cosas que solo un comando podría hacer.

No sé cómo está formateado "listener.ora", pero la línea siguiente debería funcionar bien, como máximo con algunos ajustes menores.

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

-rpara expresiones regulares
-npara suprimir la impresión automática
/PORT/para buscar la línea que contiene PUERTO
s/para reemplazar
/ppara imprimir las líneas editadas

Utilice cabeza o cola para obtener uno u otro valor.

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

O si quieres ambos:

grab_port () { sed -rn '/PORT/ s/.*([0-9]{4}).*/\1/p' /ora$sid/dbs/listener.ora ; }
$PUERTO0=$(grab_port|cabeza -1)
$PUERTO1=$(grab_port|cola -1)

Ahora, veamos tu línea:

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

La parte que comienza con "port=termina con | echo $port", canalizando el resultado de su propia variable hacia sí mismo... no es lo que quieres hacer aquí. Editar: sin mencionar que ni siquiera está ejecutando el comando ni creando la variable. Simplemente no está construido correctamente.

Si configura la variable del puerto antes, también se vuelve más fácil.

leer -p "Maquina : " maquina; leer -p "SID: "sid; ssh ora$sid@`echo $maquina` "$PUERTO0"

Respuesta4

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

o

Cambie if($count > NUM) para restringir el número de coincidencias devueltas, aquí son 3 coincidencias.

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

información relacionada