Kuinka jäsentää csv-tiedosto bash: lla

Minulla on CSV-tiedosto, jossa on IP-osoitteet ja avoimet portit:

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

Jokaiselle avoimen portin sisältävälle IP-osoitteelle minun on suoritettava komento käyttämällä sekä IP-osoitetta että avoimen portin porttinumeroa (otettu CSV-otsikosta).

Kommentit

  • Pitääkö komennon, jonka teet jokaiselle avoimen portin IP-osoitteelle, vastaavan portin numeron? Onko porttinumero CSV-otsikossa mainittu numero?
  • @Kusalananda täsmälleen !!
  • ja kiitos, että autat minua muokkaamaan kysymystäni @Kusalananda, ja ymmärrät kysymykseni,
  • I ' välitän tämän kysymyksen, kiitos; mutta jos vastaisin, haluaisin tietää, minkä komennon ' suoritat uudelleen, jotta se ' selvittää kuinka portti tulisi kuvata. Luulen, että ' d tekee vastauksesta hyödyllisemmän sinulle. Olen ' myös utelias, jos mahdollisten porttien määrä päättyy 26: een tai voi nousta 65535: een? Lisäksi olisiko koskaan vain yksi avoin portti? Voisiko olla nolla tai useampi kuin yksi?
  • @JeffSchaller -komento on telnet ja porttinumero ei ole enempää kuin 65535, mutta minulla on yli 900 porttia ja tila muuttuu joka kerta skannauksen yhteydessä. Haluan saavuttaa tarkistamalla, onko aktiivista telnet-istunnon kuuntelua, mutta tarvitsen vain apua valitessasi avointa IP-osoitetta ja porttinumeroa

Vastaa

Tämän kilpailun ratkaiseminen puhtaana bash ei mielestäni ole suositeltavaa. Katso esim. kysymys ” Miksi kuorisilmukan käyttöä tekstin käsittelemiseksi pidetään huonona käytäntönä? ”.

Anna sen sijaan antaa syötetiedot hieman helpommin sulava.

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

Tämä komento awk lukisi ensin porttinumerot CSV-tiedosto taulukoksi nimeltä port. Sarakkeen N porttinumero tallennettaisiin kansioon port[N].

Se tekee tämän jakamalla syötteen ensimmäisen rivin pilkkuihin ja yksinkertaisesti tallentamalla tuloksen port -taulukkoon. Tätä split() -komento tekee. Ehto FNR == 1 tarkoittaa ”Jos tämä on tiedoston ensimmäinen rivi, tee tämä …” (FNR on nykyisen syötetiedoston rivinumero.) Kullekin syöteriville suoritetaan koodilohko, jolla ei ole ehtoja.

Kun olet kutsunut split(), , kentän erotin, asetetaan pilkuksi. Tämä tarkoittaa, että tiedoston muut rivit jaetaan pilkuissa automaattisesti kenttiin. Tätä käytetään toisen lohkon silmukassa silmukkaamaan jokaisen rivin CSV-kentät (toisesta kentästä viimeiseen).

Jokaisella muulla datan rivillä se silmukkaa pilkulla erotettujen kenttien läpi ja kun se löytää kentän, jonka arvo on merkkijono open, se tulostaa IP-osoitteen (ensimmäisen kentän) ja vastaavan portin numeron.

Tämän komennon lähtö, kun kysymyksessä olevat tiedot ovat

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 

Tämän voi helposti lukea kuoren silmukalla:

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

Tämä lukee IP-osoitteen ja portin numeron yksi kerrallaan.

Näiden yhdistäminen täydelliseksi komentotiedostoksi:

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

awk komento johdetaan while -silmukkaan, joka lukee arvot ja kutsuu komennon (huomioi | -putki syötetyn tiedostonimen jälkeen).

Huomaa, että jos IP-osoitteessa on useita portteja auki, komento suoritetaan useita kertoja kyseiselle osoitteelle.

Kommentit

  • OMG tämä oli mitä minä olin tr Se on hämmästyttävää. Olen tyhmä Voitteko auttaa minua ymmärtämään tätä enemmän (voitko kertoa minulle virheenkorjaustilassa?)
  • @biniyamgetu Minun on tiedettävä tarkalleen mitä minun on selitettävä.
  • Bro I olen todella kiitollinen, tämä on niin hyödyllistä … joten mitä FNR == 1 tekee, niin näen jakautumisen ja mikä on FS
  • @biniyamgetu Pidä kiinni, lisätään ylimääräistä tekstiä näistä asioista .
  • olet nero, ja se tekee mitä halusin tehdä … Kiitos herra !!

Vastaa

Valitse ensimmäinen ja seuraava vastaava kenttä käyttämällä awk.

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

Kommentit

  • Tämä ei ' t vielä osoita komentoa tai käyttää portteja. Jatkossa, kun kysymyksiä kommentoidaan ja muokataan kovasti, ehdotan ' ehdotan odottavan vaatimusten täyttymistä ennen vastauksen yrittämistä.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *