1つの値を返して変数に保存する

1つの値を返して変数に保存する

2 つの値を返すこの文があります。

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

Return
1521
1522

この文では、1 つの値のみを取得したいです。この値を変数に保存して、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

コマンドの構築方法を考慮すると、headtail、または 2 つの組み合わせを使用して 1 つの結果のみを取得することをお勧めします。最初の結果だけが必要な場合は、を実行してください。特定の行番号を探している場合は、とhead -1の組み合わせが必要になる可能性があります。headtail

答え2

最初に返された値が必要な場合は、 を使用し|head -1て取得できます。

次に、$()構造体を使用して値として返すことができます。例:

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

答え3

これは、1 つのコマンドでしか実行できない同じ処理を、多数のコマンドで実行していることになります。

「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)

さて、あなたのセリフを見てみましょう:

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"

で始まる部分は"port=で終わり| echo $port"、独自の変数の結果をそれ自体にパイプします...ここでやりたいことではありません。編集:言うまでもなく、コマンドを実行したり変数を作成したりしていません。適切に構築されていません。

事前にポート変数を設定しておくと、さらに簡単になります。

read -p "Maquina : " maquina; read -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

関連情報