我有這句話回傳兩個值。
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)
或者如果你兩個都想要:
grab_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