Hoe csv-bestand te ontleden met bash

Ik heb een CSV-bestand met IP-adressen en open poorten:

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

Voor elk IP-adres met een open poort moet ik een commando uitvoeren met zowel het IP-adres als het poortnummer van de open poort (overgenomen uit de CSV-header).

Opmerkingen

  • Moet het commando dat je uitvoert voor elk IP met open poorten het corresponderende poortnummer gebruiken? Is het poortnummer het nummer in de CSV-header?
  • @Kusalananda precies !!
  • en bedankt voor je hulp bij het bewerken van mijn vraag @Kusalananda en je hebt mijn vraag begrepen,
  • Ik ' zal deze specifieke vraag doorgeven, bedankt; maar als ik zou antwoorden, zou ik willen weten welk commando je ' opnieuw uitvoert, zodat het ' duidelijk maakt hoe de poort moet worden afgebeeld. Ik denk dat ' het antwoord nuttiger voor je zou maken. Ik ' ben ook benieuwd of het aantal mogelijke poorten eindigt op 26 of kan oplopen tot 65.535? Zou er ook maar ooit één open poort zijn? Kunnen er nul of meer dan één zijn?
  • Het @JeffSchaller-commando is telnet en het poortnummer is niet t / m 65.535, maar ik heb meer dan 900 poorten en hun status zal elke keer met de scan veranderen. wat ik wil bereiken is controleren of er een actieve telnet-sessie luistert, maar ik heb alleen de hulp nodig bij het kiezen van een IP-adres en poortnummer dat open is

Antwoord

Dit competent oplossen in pure bash zou, denk ik, niet aan te raden zijn. Zie b.v. de vraag “ Waarom wordt het gebruik van een shell-lus om tekst te verwerken als een slechte gewoonte beschouwd? “.

Laten we in plaats daarvan de invoergegevens iets gemakkelijker te verteren.

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

Dit awk commando zou eerst de poortnummers lezen van de eerste regel van het CSV-bestand in een array met de naam port. Het poortnummer voor kolom N zou worden opgeslagen in port[N].

Het doet dit door de eerste regel van de invoer op kommas te splitsen en het resultaat eenvoudig op te slaan in de port array. Dit is wat de split() commando doet dat wel. De voorwaarde FNR == 1 betekent “Als dit de eerste regel van het bestand is, doe dit dan …” (FNR is het regelnummer in het huidige invoerbestand). Een codeblok zonder voorwaarde zal worden uitgevoerd voor elke regel invoer.

Na het aanroepen van split(), , het veldscheidingsteken, is ingesteld op een komma. Dit betekent dat de andere regels in het bestand automatisch op kommas in velden worden opgesplitst. Dit wordt gebruikt in de lus in het tweede blok om de CSV-velden (van het tweede tot het laatste veld) op elke regel te doorlopen.

Voor elk van de andere rijen in de gegevens loopt het door de door kommas gescheiden velden, en wanneer het een veld vindt waarvan de waarde de tekenreeks open is, het drukt het IP-adres (het eerste veld) en het corresponderende poortnummer af.

De uitvoer van dit commando, gegeven de gegevens in de vraag is

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 

Dit kan gemakkelijk worden gelezen door een lus in de shell:

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

Dit leest het IP-adres en poortnummer één voor één uit.

Om deze te combineren tot een compleet script:

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

De uitvoer van de awk commando wordt doorgesluisd naar de while lus die de waarden leest en het commando aanroept (let op de | pijp achter de ingevoerde bestandsnaam).

Merk op dat als een IP-adres meer dan één poort open heeft, de opdracht meerdere keren voor dat adres zal worden uitgevoerd.

Opmerkingen

  • OMG dit was wat ik was tr Dit is geweldig om te doen. Ik ben dom. Kun je me alsjeblieft helpen dit beter te begrijpen (kun je het me vertellen in de foutopsporingsmodus?)
  • @biniyamgetu Ik moet precies weten wat ik moet uitleggen.
  • Bro, ik ben echt dankbaar, dit is zo nuttig … dus, wat doet FNR == 1, dan zie ik splitsen en wat is FS
  • @biniyamgetu Wacht even, ik zal wat extra tekst over die dingen toevoegen .
  • je bent geniaal, en het doet wat ik wilde doen … Dank je wel meneer !!

Antwoord

Selecteer uw eerste en volgende respectieve velden met awk.

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

Opmerkingen

  • Dit heeft nog geen ' adres om een commando uit te voeren of de poorten te gebruiken. Voor de toekomst, wanneer vragen zwaar becommentarieerd en bewerkt worden, stel ik ' voor om te wachten tot de vereisten zijn opgelost voordat ik probeer een antwoord te geven.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *