Come analizzare il file csv con bash

Ho un file CSV con indirizzi IP e porte aperte:

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,,,,, 

Per ogni indirizzo IP con una porta aperta, devo eseguire un comando utilizzando sia lindirizzo IP che il numero di porta della porta aperta (preso dallintestazione CSV).

Commenti

  • Il comando che esegui per ogni IP con porte aperte dovrà utilizzare il numero di porta corrispondente? Il numero di porta è il numero elencato nellintestazione CSV?
  • @Kusalananda esattamente !!
  • e grazie per avermi aiutato a modificare la mia domanda @Kusalananda e hai capito la mia domanda,
  • Io ' passerò questa domanda in particolare, grazie; ma se dovessi rispondere, vorrei sapere quale comando ' stai eseguendo, in modo che ' sia chiaro come il port dovrebbe essere rappresentato. Penso che ' ti renda la risposta più utile. ' sarei anche curioso se il numero di porte possibili finisce a 26 o potrebbe salire a 65.535? Inoltre, ci sarebbe sempre una porta aperta? Potrebbe esserci zero o più di uno?
  • Il comando @JeffSchaller è telnet e il numero di porta non è fino a 65.535 ma ho più di 900 porte e lo stato cambierà ogni volta con la scansione. quello che voglio ottenere è controllare se cè qualche sessione telnet attiva in ascolto ma ho solo bisogno di aiuto per scegliere lIP e il numero di porta aperti

Risposta

Risolvere questo con competenza in puro bash non sarebbe, credo, consigliabile. Vedi ad es. la domanda “ Perché utilizzare un ciclo di shell per elaborare il testo è considerato una cattiva pratica? “.

Invece, facciamo “s i dati di input un po più facile da digerire.

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

Questo comando awk legge prima i numeri di porta dalla prima riga di il file CSV in un array denominato port. Il numero di porta per la colonna N verrebbe memorizzato in port[N].

Lo fa dividendo la prima riga dellinput tra virgole e memorizzando semplicemente il risultato nellarray port. Questo è ciò che split() comando sì. La condizione FNR == 1 significa “Se questa è la prima riga del file, esegui questa operazione …” (FNR è il numero di riga nel file di input corrente). Un blocco di codice senza condizioni verrà eseguito per ogni riga di input.

Dopo aver chiamato split(), , il separatore di campo, è impostato su una virgola. Ciò significa che le altre righe nel file verranno automaticamente suddivise tra virgole in campi. Viene utilizzato nel ciclo nel secondo blocco per eseguire il ciclo sui campi CSV (dal secondo allultimo) su ciascuna riga.

Per ciascuna delle altre righe nei dati, scorre i campi delimitati da virgole e quando trova un campo il cui valore è la stringa open, stampa lindirizzo IP (il primo campo) e il numero di porta corrispondente.

Loutput di questo comando, dati i dati nella domanda, è

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 

Questo può essere facilmente letto da un ciclo nella shell:

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

Questo legge lindirizzo IP e il numero di porta, uno per uno.

Per combinarli in uno script completo:

#!/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 

Loutput del awk il comando viene reindirizzato al while ciclo che legge i valori e chiama il comando (nota la | pipe dopo il nome del file di input).

Nota che se un indirizzo IP ha più di una porta aperta, il comando verrà eseguito più volte per quellindirizzo.

Commenti

  • OMG questo era quello che ero tr che stai per fare, è fantastico. Sono stupido Puoi aiutarmi a capire di più (puoi dirmi in modalità di debug?)
  • @biniyamgetu Ho bisogno di sapere esattamente cosa devo spiegare.
  • Bro I sono davvero grato, è così utile … quindi, cosa sta facendo FNR == 1, allora vedo split e cosè FS
  • @biniyamgetu Aspetta, aggiungerò del testo extra su queste cose .
  • sei geniale e sta facendo quello che volevo fare … Grazie signore !!

Risposta

Seleziona il primo e il successivo campo corrispondente utilizzando awk.

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

Commenti

  • Questo ' non risolve ancora lesecuzione di un comando o lutilizzo delle porte. Per il futuro, quando le domande sono soggette a numerosi commenti e modifiche, ' suggerirei di attendere che i requisiti si stabiliscano prima di tentare una risposta.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *