Shell Script in Datei suchen.
Hallo Admins,
ich muss für die Arbeit ein Shell Script schreiben, welches einen anderen Befehl auswertet.
Der Befehl gibt folgendes aus:
Run | KHD | SHD | RunHost | IPv4 | IPv6 | ILO | adm-PW | Server Name
+-------+----------+------------+-----------------+-----------------------+-----------------+----------+-----------------------
| aaa | aaa-a | Server 1 | 127.0.0.1 | | | | mail.domain.de
| aab | aab-b | Server 2 | 127.0.0.1 | | | | Server 2
| aac | aac-c | Server 1 | 127.0.0.1 | | | | web1.domain.de
| abd | aad-d | Server 1 | 127.0.0.1 | | | | Server 1
Hintergrund ist folgender, dass ich wissen will, welcher Server dediziert ist (Hardware) und welcher virtuell ist.
Wenn also RunHost und Servername gleich sind, dann ist der Server dediziert.
Wenn nicht dann virtuell.
Wie bekomme ich ein Script, welches mir die Ausgabe mit ca. 5700 virtuellen/dedizierten Servern filtert.
Der zweite Schritt wäre dann, wenn RunHost = Server Name gleich ist, das Ergebnis in eine Variable zu schreiben.
Meine Frage: Wie bekommt man das hin, dass ich gezielt nur Die Spalte RunHost und Server Name greppen kann?
Und wie kann ich das am besten lösen.
Bin leider ein Shell Einsteiger. Also seit mir bitte nicht böse.
Danke für eure Hilfe.
Johannes91
ich muss für die Arbeit ein Shell Script schreiben, welches einen anderen Befehl auswertet.
Der Befehl gibt folgendes aus:
Run | KHD | SHD | RunHost | IPv4 | IPv6 | ILO | adm-PW | Server Name
+-------+----------+------------+-----------------+-----------------------+-----------------+----------+-----------------------
| aaa | aaa-a | Server 1 | 127.0.0.1 | | | | mail.domain.de
| aab | aab-b | Server 2 | 127.0.0.1 | | | | Server 2
| aac | aac-c | Server 1 | 127.0.0.1 | | | | web1.domain.de
| abd | aad-d | Server 1 | 127.0.0.1 | | | | Server 1
Hintergrund ist folgender, dass ich wissen will, welcher Server dediziert ist (Hardware) und welcher virtuell ist.
Wenn also RunHost und Servername gleich sind, dann ist der Server dediziert.
Wenn nicht dann virtuell.
Wie bekomme ich ein Script, welches mir die Ausgabe mit ca. 5700 virtuellen/dedizierten Servern filtert.
Der zweite Schritt wäre dann, wenn RunHost = Server Name gleich ist, das Ergebnis in eine Variable zu schreiben.
Meine Frage: Wie bekommt man das hin, dass ich gezielt nur Die Spalte RunHost und Server Name greppen kann?
Und wie kann ich das am besten lösen.
Bin leider ein Shell Einsteiger. Also seit mir bitte nicht böse.
Danke für eure Hilfe.
Johannes91
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 143731
Url: https://administrator.de/contentid/143731
Ausgedruckt am: 22.11.2024 um 19:11 Uhr
3 Kommentare
Neuester Kommentar
Hallo Johannes,
das sollte, falls die Ausgabe in einer Datei vorliegt, ein Batch Einzeiler können:
Deinen Dateinamen müsstest du an statt test.txt einsetzen.
Zu beachten ist das die letzte Spalte keine anhängedes Leerzeichen hat wie Spalte 3, deshalb muss es beim Vergleich angehängt werden.
Skip=2 überspringt den Header.
Bei mir kommt mit deinen Testdaten dies heraus,
Gruß
LotPings
das sollte, falls die Ausgabe in einer Datei vorliegt, ein Batch Einzeiler können:
for /f "skip=2 Tokens=1-9 Delims=|" %A in (test.txt) Do if "%C" EQU "%H " (Echo dediziert %C %H) Else (Echo virtuell %C %H)
Zu beachten ist das die letzte Spalte keine anhängedes Leerzeichen hat wie Spalte 3, deshalb muss es beim Vergleich angehängt werden.
Skip=2 überspringt den Header.
Bei mir kommt mit deinen Testdaten dies heraus,
-virtuell Server 1 mail.domain.de
dediziert Server 2 Server 2
-virtuell Server 1 web1.domain.de
dediziert Server 1 Server 1
Gruß
LotPings
Hi,
falls Du öfters mal was skripten musst, dann kann ich Dir den "Advanced BASH scripting Guide" von tldp.org empfehlen.
Zu Deinem Problem:
Grep wird Dich nicht unbedingt weiter bringen, ich würed da eher mit einer FOR-Schleife arbeiten:
Weiter kannst Du Dir mit dem CUT-Befehl dann die eintsprechenden Spalten rausholen (Tip: Dein Delimiter ist das Pipe-Symbol), und Diese dann vergleichen.
Mein Ansatz kommt auch ohne Skript, als Einzeiler aus:
Tolle Wurst, funktioniert aber leider nur, wenn man vorher alle Leerzeichen aus der Eingabe-Datei entfernt hat ('sed -i 's/ //g' $DATEINAME), damit ist das Ergebnis aber leider etwas verfälscht.
falls Du öfters mal was skripten musst, dann kann ich Dir den "Advanced BASH scripting Guide" von tldp.org empfehlen.
Zu Deinem Problem:
Grep wird Dich nicht unbedingt weiter bringen, ich würed da eher mit einer FOR-Schleife arbeiten:
while read LINE
do
$LINE # VARIABLE, in der der Inhalt der jeweiligen Zeile steht
done < $EINGABEDATEI
Weiter kannst Du Dir mit dem CUT-Befehl dann die eintsprechenden Spalten rausholen (Tip: Dein Delimiter ist das Pipe-Symbol), und Diese dann vergleichen.
Mein Ansatz kommt auch ohne Skript, als Einzeiler aus:
while IFS='|' read run khd shd runhost ipv4 ipv6 ilo admpw servername ; do if [ "$runhost" == "$servername" ]; then echo "$servername"; fi ; done < $DATEINAME
Wenn es denn die bash sein soll,
geht es auch mit sed und awk (Dateiname test.txt):
Ausgabe:
Damit die sed und gawk Kombination unter Win32 console läuft, müsste sie so aussehen:
Gruß
LotPings
geht es auch mit sed und awk (Dateiname test.txt):
sed -n 's/ *| */|/pg' test.txt|awk -F\| '{if (NR >1) if ($4 == $9) {print "dediziert "$4,$9} else print "-virtuell "$4,$9}'
-virtuell Server 1 mail.domain.de
dediziert Server 2 Server 2
-virtuell Server 1 web1.domain.de
dediziert Server 1 Server 1
Damit die sed und gawk Kombination unter Win32 console läuft, müsste sie so aussehen:
sed -n "s/ *| */|/pg" test.txt|gawk -F^| "{if (NR >1) if ($4 == $9) {print \"dediziert\",$4,$9} else print \"-virtuell\",$4,$9}"
Gruß
LotPings