So analysieren Sie eine CSV-Datei mit Bash

Ich habe eine CSV-Datei mit IP-Adressen und offenen Ports:

IP,1,3,4,6,7,9,13,17,19,20,21,22,23,24,25,26 1.1.1.2,,,,,,,,,,,open,,,,, 1.1.1.3,,,,,,,,,,,open,,,,, 1.1.1.4,,open ,open,,,,,,,,open,,,,, 1.1.1.5,,,,,,,,,,,open,,,,, 1.2.3.4,,,,,,,,,,,open,,,,, 1.4.5.6,,,,,open,,,,,,open,,,,, 1.4.5.6,,,,,,,,,,,open,,,,, 1.1.3.4,,,,,,,,,,,open,,,,, 

Für jede IP-Adresse mit offenem Port muss ein Befehl ausgeführt werden, der sowohl die IP-Adresse als auch die Portnummer des offenen Ports verwendet (aus dem CSV-Header entnommen).

Kommentare

  • Muss der Befehl, den Sie für jede IP mit offenen Ports ausführen, die entsprechende Portnummer verwenden? Ist die Portnummer die Nummer, die im CSV-Header aufgeführt ist?
  • @Kusalananda genau !!
  • und danke, dass Sie mir bei der Bearbeitung meiner Frage @Kusalananda geholfen haben und Sie meine Frage verstanden haben,
  • Ich ' werde diese spezielle Frage weiterleiten, danke; aber wenn ich antworten würde, würde ich wissen wollen, welchen Befehl Sie ' ausführen, damit ' klar ist, wie der Port ist sollte dargestellt werden. Ich denke, dass ' die Antwort für Sie nützlicher machen würde. Ich ' wäre auch neugierig, ob die Anzahl der möglichen Ports bei 26 endet oder auf 65.535 steigen könnte? Würde es auch immer nur einen offenen Port geben? Könnte es null oder mehr als eins geben?
  • Der Befehl @JeffSchaller ist Telnet und die Portnummer ist nicht bis zu 65.535, aber ich habe mehr als 900 Ports und der Status ändert sich jedes Mal mit dem Scan. Was ich erreichen möchte, ist zu überprüfen, ob eine aktive Telnet-Sitzung abgehört wird, aber ich brauche nur die Hilfe bei der Auswahl der offenen IP- und Portnummer

Antwort

Dies kompetent in reinem bash zu lösen, wäre meines Erachtens nicht ratsam. Siehe z. Die Frage „ Warum wird die Verwendung einer Shell-Schleife zum Verarbeiten von Text als schlechte Praxis angesehen? „.

Lassen Sie uns stattdessen die Eingabedaten erstellen etwas einfacher zu verdauen.

awk "FNR == 1 { split($0, port, ","); FS=","; next } { for (i=2; i<=NF; ++i) if ($i == "open") print $1, port[i] }" file.csv 

Dieser awk Befehl liest zuerst die Portnummern aus der ersten Zeile von Die CSV-Datei in einem Array mit dem Namen port. Die Portnummer für die Spalte N wird in port[N].

Dazu wird die erste Zeile der Eingabe in Kommas aufgeteilt und das Ergebnis einfach im Array port gespeichert. Dies ist das split() wird ausgeführt. Die Bedingung FNR == 1 bedeutet „Wenn dies die erste Zeile der Datei ist, dann tun Sie dies …“ (FNR ist die Zeilennummer in der aktuellen Eingabedatei. Für jede Eingabezeile wird ein Codeblock ohne Bedingung ausgeführt.

Nach dem Aufruf von split(), , das Feldtrennzeichen, wird auf ein Komma gesetzt. Dies bedeutet, dass die anderen Zeilen in der Datei automatisch durch Kommas in Felder aufgeteilt werden. Dies wird in der Schleife im zweiten Block verwendet, um die CSV-Felder (vom zweiten bis zum letzten Feld) in jeder Zeile zu durchlaufen.

Für jede der anderen Zeilen in den Daten werden die durch Kommas getrennten Felder durchlaufen, und wenn ein Feld gefunden wird, dessen Wert die Zeichenfolge open ist, Es druckt die IP-Adresse (das erste Feld) und die entsprechende Portnummer aus.

Die Ausgabe dieses Befehls ist angesichts der Daten in der Frage

1.1.1.2 21 1.1.1.3 21 1.1.1.4 4 1.1.1.4 21 1.1.1.5 21 1.2.3.4 21 1.4.5.6 7 1.4.5.6 21 1.4.5.6 21 1.1.3.4 21 

Dies kann leicht von einer Schleife in der Shell gelesen werden:

while read -r ip port; do telnet "$ip" "$port" # or whatever your command is done 

Hiermit werden die IP-Adresse und die Portnummer nacheinander gelesen.

So kombinieren Sie diese zu einem vollständigen Skript:

#!/bin/sh awk "FNR == 1 { split($0, port, ","); FS=","; next } { for (i=2; i<=NF; ++i) if ($i == "open") print $1, port[i] }" file.csv | while read -r ip port; do telnet "$ip" "$port" # or whatever your command is done 

Die Ausgabe der awk Der Befehl wird an die while -Schleife weitergeleitet, die die Werte liest und den Befehl aufruft (beachten Sie die | -Pipe nach dem Eingabedateinamen).

Beachten Sie, dass bei einer IP-Adresse, bei der mehr als ein Port geöffnet ist, der Befehl für diese Adresse mehrmals ausgeführt wird.

Kommentare

    h mein Gott, das war ich Das ist erstaunlich. Ich bin dumm Kannst du mir bitte helfen, das besser zu verstehen (kannst du es mir im Debugging-Modus sagen?)
  • @biniyamgetu Ich muss genau wissen, was ich erklären muss.
  • Bro I. Ich bin wirklich dankbar, das ist so hilfreich … also, was macht FNR == 1, dann sehe ich Split und was ist FS
  • @biniyamgetu Moment mal, ich werde einen zusätzlichen Text über diese Dinge hinzufügen .
  • Sie sind genial und es tut, was ich tun wollte … Danke, Sir !!

Antwort

Wählen Sie mit awk Ihr erstes und das nächste entsprechende Feld aus.

awk -d "," -F "{print $1, $n...} 

Kommentare

  • Dies ' adressiert noch nicht die Ausführung eines Befehls oder die Verwendung der Ports. Für die Zukunft, wenn Fragen stark kommentiert und bearbeitet werden, würde ich ' vorschlagen, zu warten, bis sich die Anforderungen beruhigt haben, bevor Sie eine Antwort versuchen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.