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 -1
sollten Sie dies tun. Wenn Sie nach einer bestimmten Zeilennummer suchen, ist wahrscheinlich eine Kombination aus head
und tail
erforderlich.
Antwort2
Wenn Sie den ersten zurückgegebenen Wert möchten, können Sie |head -1
ihn 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
-r
für Regex
-n
zum Unterdrücken des automatischen Druckens
/PORT/
zum Suchen von Zeilen mit PORT
s/
für Ersetzen
/p
zum 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