Gibt einen Wert zurück und speichert ihn in einer Variablen

Gibt einen Wert zurück und speichert ihn in einer Variablen

Ich habe diesen Satz, der zwei Werte zurückgibt.

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

Return
1521
1522

Mit diesem Satz möchte ich nur einen Wert erhalten. Diesen Wert möchte ich in einer Variable speichern, um daraus einen SQLPlus-String zu erstellen, der automatisch eine Verbindung zur Oracle-Datenbank herstellt und dann einen Befehl ausführt.

Wie kann ich die Anzahl der zurückgegebenen Ergebnisse begrenzen und in einer Variablen speichern, um diesen Wert später in einem anderen Befehl zu verwenden?

Aktualisieren:

Ich habe den Satz in einen SSH-Aufruf eingefügt, aber wenn ich ihn ausführe, erhalte ich keinen Wert (ohne SSH-Aufruf funktioniert es mit head -1 einwandfrei)

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"

Antwort1

Angesichts der Art und Weise, wie Sie den Befehl erstellt haben, wäre es empfehlenswert head, tail, oder eine Kombination aus beiden zu verwenden, um nur ein Ergebnis zu erhalten. Wenn Sie nur das erste Ergebnis möchten, head -1sollten Sie dies tun. Wenn Sie nach einer bestimmten Zeilennummer suchen, ist wahrscheinlich eine Kombination aus headund tailerforderlich.

Antwort2

Wenn Sie den ersten zurückgegebenen Wert möchten, können Sie |head -1ihn abrufen.

Sie können die Struktur dann verwenden, $()um es als Wert zurückzugeben, z. B.

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

Antwort3

Das sind eine Menge Befehle, die dasselbe tun, was nur ein Befehl tun könnte.

Ich weiß nicht, wie „listener.ora“ formatiert ist, aber die folgende Zeile sollte, höchstens mit ein paar kleinen Änderungen, einwandfrei funktionieren.

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

-rfür Regex
-nzum Unterdrücken des automatischen Druckens
/PORT/zum Suchen von Zeilen mit PORT
s/für Ersetzen
/pzum Drucken der bearbeiteten Zeilen

Verwenden Sie Kopf oder Zahl, um den einen oder anderen Wert zu erhalten.

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

Oder wenn Sie beides möchten:

grab_port () { sed -rn '/PORT/ s/.*([0-9]{4}).*/\1/p' /ora$sid/dbs/listener.ora ; }
$PORT0=$(Port_greifen|Kopf -1)
$PORT1=$(Port_greifen|Endstück -1)

Schauen wir uns nun Ihre Zeile an:

lesen -p "Maschine: " Maschine; lesen -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"

Der Teil, der mit beginnt und "port=mit endet | echo $port", leitet das Ergebnis seiner eigenen Variable an sich selbst weiter … nicht das, was Sie hier tun möchten. Bearbeiten: Ganz zu schweigen davon, dass es nicht einmal den Befehl ausführt oder die Variable erstellt. Es ist einfach nicht richtig konstruiert.

Wenn Sie vorher die Portvariable festlegen, wird es auch einfacher.

lesen -p "Maschine: " Maschine; lesen -p "SID: " sid; ssh oder $sid@`echo $Maschine` "$PORT0"

Antwort4

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

oder

Ändern Sie „if($count > NUM), um die Anzahl der zurückgegebenen Übereinstimmungen zu beschränken. Hier sind es 3 Übereinstimmungen.

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

verwandte Informationen