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
, tail
o alguna combinación de los dos para obtener un solo resultado. Si solo quieres el primer resultado, head -1
deberías hacerlo. Si está buscando un número de línea específico, probablemente será necesaria una combinación de head
y .tail
Respuesta2
Si desea el primer valor devuelto, puede utilizarlo |head -1
para 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
-r
para expresiones regulares
-n
para suprimir la impresión automática
/PORT/
para buscar la línea que contiene PUERTO
s/
para reemplazar
/p
para 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