Hogyan elemezzem a csv fájlt a bash

IP-címmel és nyitott portokkal rendelkező CSV-fájlommal rendelkezem:

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

Minden nyitott porttal rendelkező IP-címhez egy parancsot kell végrehajtanom, mind az IP-cím, mind a nyitott port portszámának felhasználásával (a CSV fejlécéből).

Megjegyzések

  • A nyitott portokkal rendelkező IP-k számára végrehajtott parancsnak a megfelelő portszámot kell használnia? A portszám a CSV fejlécében felsorolt szám?
  • Pontosan @Kusalananda !!
  • és köszönöm, hogy segítettetek szerkeszteni a kérdésemet @Kusalananda, és megértettétek a kérdésemet,
  • Én ' továbbadom ezt a bizonyos kérdést, köszönöm; de ha válaszolnék, szeretném tudni, hogy melyik parancsot hajtja végre ', hogy ' egyértelművé tegye a port ábrázolni kell. Úgy gondolom, hogy ' d a választ sokkal hasznosabbá teszi számodra. <

kíváncsi lennék arra is, ha a lehetséges portok száma 26-ra végződik, vagy akár 65 535-re is felmehet? Ezenkívül csak egy nyitott port lehet? Lehet, hogy nulla vagy egynél több?

  • A @JeffSchaller parancs telnet, és a portszám nem haladja meg a 65 535-öt, de több mint 900 portom van, és az állapot minden alkalommal változik a vizsgálat során. amit el akarok érni, annak ellenőrzése, hogy van-e aktív telnet munkamenet-figyelés, de csak segítségre van szükségem a nyitott IP- és portszám kiválasztásában
  • Válasz

    Ennek versenyképes megoldása tiszta bash -ben szerintem nem lenne tanácsos. Lásd pl. a “ kérdés miért minősül rossz gyakorlatnak a shell feldolgozása a szöveg feldolgozásának? “.

    Ehelyett adjuk meg a bemeneti adatokat egy kicsit könnyebben emészthető.

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

    Ez a awk parancs először beolvassa a portszámokat a a CSV-fájlt egy port nevű tömbbe. A N oszlop portszámát a port[N].

    Ezt úgy teszi meg, hogy a bemenet első sorát vesszőkre osztja, és az eredményt egyszerűen az port tömbben tárolja. Ezt a split() parancs megteszi. A FNR == 1 feltétel azt jelenti: “Ha ez a fájl első sora, akkor tegye ezt …” (FNR az aktuális bemeneti fájl sorszáma.) Minden bemenetsorhoz végrehajtunk egy kódblokkot, amelyen nincs feltétel.

    A split(), mezőelválasztó vesszőre van állítva. Ez azt jelenti, hogy a fájl többi sora vesszőkből automatikusan mezőkre lesz osztva. Ezt a második blokk hurokjában használják az egyes sorok CSV-mezőinek (a második mezőtől az utolsóig) áthúzására.

    Az adatok többi sorában a vesszővel elválasztott mezőkön körbevezet, és amikor olyan mezőt talál, amelynek értéke a open karakterlánc, kinyomtatja az IP-címet (az első mezőt) és a hozzá tartozó portszámot.

    Ennek a parancsnak a kimenete, a kérdés adatait tekintve

    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 

    Ezt könnyen leolvashatja a héjban lévő hurok:

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

    Ez egyesével olvassa az IP-címet és a portszámot.

    Ezeknek a teljes szkriptjévé történő összeállítása:

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

    A awk parancs átkerül a while ciklusba, amely beolvassa az értékeket és meghívja a parancsot (vegye figyelembe a | csövet a bemeneti fájlnév után).

    Ne feledje, hogy ha egy IP-címnek egynél több portja van nyitva, akkor a parancs többször is végrehajtásra kerül az adott címhez.

    Megjegyzések

    • OMG ez volt az, ami tr voltam csinálni, ez csodálatos. Buta vagyok. Kérem, segítsen nekem, hogy ezt jobban megértsem (tudna nekem hibakeresési módban mondani?)
    • @biniyamgetu Pontosan tudnom kell, hogy mit kell elmagyaráznom.
    • Bro I nagyon hálás vagyok, ez nagyon hasznos … szóval, mit csinál az FNR == 1, akkor látom, hogy kettészakadt, és mi az FS
    • @biniyamgetu Kapaszkodj meg, adok néhány extra szöveget ezekről a dolgokról .
    • zseniális vagy, és azt csinálja, amit szerettem volna … Köszönöm, uram !!

    Válasz

    Válassza ki az első és a következő megfelelő mezőt a awk gombbal.

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

    Megjegyzések

    • Ez nem ' még nem parancsot végrehajtó vagy a portokat használó cím. A jövőben, amikor a kérdéseket erősen kommentálják és szerkesztik, ' azt javaslom, hogy a válasz megkísérlése előtt várjon a követelmények rendezésére.

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük