我有这句话返回两个值。
cat /ora$sid/dbs/listener.ora|grep PORT|sed 's/.*PORT.*\([0-9]\{4\}\)\(.*\)/\1/'
Return
1521
1522
通过这句话我只想得到一个值。我想将这个值保存到一个变量中,以构建一个sqlplus字符串来自动连接到oracle数据库,然后执行命令。
如何限制返回结果的数量并将其保存到变量中以便稍后在另一个命令中使用该值?
更新:
我已将这句话添加到 ssh 调用中,但是当我执行它时,我没有获得任何值(没有 ssh 调用可以在 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"
答案1
鉴于您构建命令的方式,建议使用head
、tail
或两者的某种组合来仅获得一个结果。如果你只想要第一个结果,head -1
应该这样做。如果您要查找特定的行号,则可能需要head
和的组合。tail
答案2
如果您想要第一个返回值,可以使用|head -1
它来获取它。
然后您可以使用该$()
结构将其作为值返回,例如
port=$(cat /ora$sid/dbs/listener.ora|grep PORT|sed 's/.*PORT.*\([0-9]\{4\}\)\(.*\)/\1/' | head -1)
答案3
有很多命令在执行只有一个命令可以执行的相同操作。
我不知道“listener.ora”的格式如何,但下面的行应该可以正常工作,最多需要进行一些小的调整。
sed -rn '/PORT/ s/.*([0-9]{4}).*/\1/p' /ora$sid/dbs/listener.ora
-r
用于正则表达式
-n
用于抑制自动打印
/PORT/
以查找包含 PORT 的行
s/
用于替换
/p
以打印编辑的行
使用 head 或 tail 来获取一个或另一个值。
$PORT0=(sed -rn '/PORT/ s/.*([0-9]{4}).*/\1/p' /ora$sid/dbs/listener.ora | 头 -1)
或者如果你两者都想要:
scrap_port () { sed -rn '/PORT/ s/.*([0-9]{4}).*/\1/p' /ora$sid/dbs/listener.ora ; } $PORT0=$(grab_port|头-1) $PORT1=$(grab_port|尾部-1)
现在,让我们看看您的线路:
读-p“Maquina:”maquina;读取-p“SID:”sid; ssh ora$sid@`echo $maquina` "port=$(cat /ora$sid/dbs/listener.ora|grep PORT|sed 's/.*PORT.*\([0-9]\{4\ }\)\(.*\)/\1/ ' | 回显 $port"
以 开头的部分"port=
以 结尾| echo $port"
,将其自身变量的结果通过管道传递给自身......这不是您想要在此处执行的操作。编辑:更不用说它甚至没有运行命令或创建变量。它只是没有正确构建。
如果您之前设置了端口变量,也会变得更容易。
读-p“Maquina:”maquina;读取-p“SID:”sid; ssh ora$sid@`echo $maquina` "$PORT0"
答案4
grep -m1 PORT /ora$sid/dbs/listener.ora | sed 's/.*PORT.*\([0-9]\{4\}\)\(.*\)/\1/'
或者
更改 if($count > NUM) 以限制返回匹配项的数量,此处为 3 个匹配项。
perl -e 'my $count = 0; while(<>) { if(/PORT (\d+)/) {print "$1\n"; $count+=1; if($count > 2) {exit}} }' /ora$sid/dbs/listener.ora