Hvordan analysere gjennom csv-fil med bash

Jeg har CSV-fil med IP-adresser og åpne porter:

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

For hver IP-adresse med en åpen port, må jeg utføre en kommando ved å bruke både IP-adressen og portnummeret til den åpne porten (hentet fra CSV-overskriften).

Kommentarer

  • Kommandoen du utfører for hver IP med åpne porter, må bruke det korresponderende portnummeret? Er portnummeret nummeret som er oppført i CSV-overskriften?
  • @Kusalananda nøyaktig !!
  • og takk for at du hjalp meg med å redigere spørsmålet mitt @Kusalananda og du forsto spørsmålet mitt,
  • Jeg ' Jeg vil gi dette spesielle spørsmålet videre, takk; men hvis jeg skulle svare, vil jeg vite hvilken kommando du ' utfører, slik at det ' er klart hvordan porten skal portretteres. Jeg tror at ' d gjør svaret mer nyttig for deg. Jeg ' ville også være nysgjerrig på om antallet mulige porter ender på 26 eller kan gå opp til 65.535? Også, ville det bare noen gang være en åpen port? Kan det være null eller mer enn en?
  • @JeffSchaller-kommandoen er telnet og portnummeret er ikke opptil 65.535, men jeg har mer enn 900 porter, og status vil endres hver gang med skanningen. det jeg vil oppnå er å sjekke om det er noen aktive telnet-sesjoner som lytter, men jeg trenger bare hjelp til å plukke IP og portnummer som er åpent

Svar

Å løse dette kompetent i ren bash vil, tror jeg, ikke være tilrådelig. Se f.eks. spørsmålet « Hvorfor betraktes det som dårlig praksis å bruke en skallsløyfe til å behandle tekst? «.

La oss i stedet lage inndataene litt lettere å fordøye.

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

Denne awk -kommandoen vil først lese portnumrene fra første linje i CSV-filen i en matrise kalt port. Portnummeret for kolonne N lagres i port[N].

Den gjør dette ved å dele den første linjen i inngangen på kommaer og bare lagre resultatet i port -matrisen. Dette er hva split() kommando gjør. Betingelsen FNR == 1 betyr «Hvis dette er den første linjen i filen, så gjør dette …» (FNR er linjenummeret i den gjeldende inndatafilen. = «0d125723a9″>

, , feltskilleren, er satt til komma. Dette betyr at de andre linjene i filen automatisk blir delt på komma i felt. Dette brukes i løkken i den andre blokken for å løpe over CSV-feltene (fra det andre feltet til det siste) på hver linje.

For hver av de andre radene i dataene, løper den gjennom kommaavgrensede felt, og når den finner et felt hvis verdi er strengen open, den skriver ut IP-adressen (det første feltet) og det korresponderende portnummeret.

Utgangen fra denne kommandoen, gitt dataene i spørsmålet, er

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 

Dette kan lett leses av en løkke i skallet:

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

Dette leser IP-adressen og portnummeret, en etter en.

For å kombinere disse i et komplett 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 

Utgangen til awk kommandoen ledes til while sløyfen som leser verdiene og kaller kommandoen (merk | -røret etter inngangsfilnavnet).

Merk at hvis en IP-adresse har mer enn en port åpen, vil kommandoen utføres flere ganger for den adressen.

Kommentarer

  • OMG dette var hva jeg var tr ying å gjøre, dette er fantastisk. Jeg er dum Kan du hjelpe meg med å forstå dette mer (kan du fortelle meg i feilsøkingsmodus?)
  • @biniyamgetu Jeg trenger å vite nøyaktig hva jeg trenger å forklare.
  • Bro I er veldig takknemlig, dette er så nyttig … så, hva gjør FNR == 1, så ser jeg splittelse og hva er FS
  • @biniyamgetu Vent, jeg vil legge til litt ekstra tekst om disse tingene .
  • du er geni, og den gjør det jeg ønsket å gjøre … Takk skal du ha, sir!

Svar

Velg ditt første og neste respektive felt ved hjelp av awk.

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

Kommentarer

  • Dette betyr ikke ' ennå ikke å utføre en kommando eller bruke portene. For fremtiden, når spørsmål gjennomgår tunge kommentarer og redigering, foreslår jeg ' å vente på at kravene skal slå seg ned før du prøver et svar.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *