Jak analyzovat soubor CSV pomocí bash

Mám soubor CSV s adresami IP a otevřenými porty:

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

Pro každou adresu IP s otevřeným portem musím provést příkaz pomocí adresy IP i čísla portu otevřeného portu (převzato z hlavičky CSV).

Komentáře

  • Bude muset příkaz, který provedete pro každou IP s otevřenými porty, používat odpovídající číslo portu? Je číslo portu číslo uvedené v záhlaví CSV?
  • @Kusalananda přesně !!
  • a děkuji, že jste mi pomohli upravit moji otázku @Kusalananda a rozuměli jste mé otázce,
  • Já ' předám tuto konkrétní otázku, děkuji; ale kdybych měl odpovědět, chtěl bych vědět, jaký příkaz ' znovu provádíte, aby ' jasně ukázal, jak port by měl být zobrazen. Myslím, že díky ' d je pro vás odpověď užitečnější. Byl bych také ' zvědavý, jestli počet možných portů končí na 26 nebo by mohl dosáhnout až 65 535? Také by někdy existoval pouze jeden otevřený port? Může být nula nebo více než jeden?
  • Příkaz @JeffSchaller je telnet a číslo portu není až 65 535, ale mám více než 900 portů a stav se při skenování pokaždé změní. čeho chci dosáhnout, je zkontrolovat, zda existuje nějaká aktivní relace telnetu, ale potřebuji pomoc s výběrem IP a čísla portu, která je otevřená

odpověď

Řešení tohoto konkurenceschopného čistého bash by, myslím, nebylo vhodné. Viz např. otázka „ Proč je použití smyčky prostředí ke zpracování textu považováno za nevhodný postup? „.

Místo toho nechme vstupní data vytvořit trochu snazší strávit.

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

Tento příkaz awk nejprve načte čísla portů z prvního řádku soubor CSV do pole s názvem port. Číslo portu pro sloupec N by bylo uloženo v port[N].

Dělá to tak, že první řádek vstupu rozdělí na čárky a výsledek jednoduše uloží do pole port. To je split() příkaz ano. Podmínka FNR == 1 znamená „Pokud se jedná o první řádek souboru, udělejte to …“ (FNR je číslo řádku v aktuálním vstupním souboru). Pro každý řádek vstupu bude spuštěn blok kódu bez podmínek.

Po volání split(), , oddělovač polí, je nastaven na čárku. To znamená, že ostatní řádky v souboru budou automaticky rozděleny čárkami na pole. To se používá ve smyčce ve druhém bloku k smyčce přes pole CSV (od druhého pole k poslednímu) na každém řádku.

U každého z ostatních řádků v datech prochází políčky oddělenými čárkami a když najde pole, jehož hodnotou je řetězec open, vytiskne IP adresu (první pole) a odpovídající číslo portu.

Výstup z tohoto příkazu, vzhledem k údajům v otázce, je

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 

Toto lze snadno přečíst smyčkou v shellu:

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

Tím se přečte jedna po druhé IP adresa a číslo portu.

Chcete-li je zkombinovat do úplného skriptu:

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

Výstup awk příkaz je pipetován do while smyčky, která čte hodnoty a volá příkaz (všimněte si | kanálu za vstupním názvem souboru).

Upozorňujeme, že pokud má adresa IP otevřený více než jeden port, příkaz bude pro tuto adresu spuštěn několikrát.

Komentáře

  • OMG to bylo to, co jsem byl tr dělat, to je úžasné. Jsem hloupý Můžete mi prosím pomoci, abych tomu více porozuměl (můžete mi to říct v režimu ladění?)
  • @biniyamgetu Potřebuji přesně vědět, co musím vysvětlit.
  • Bro I jsem opravdu vděčný, je to tak užitečné … takže, co dělá FNR == 1, pak vidím split a co je FS
  • @biniyamgetu Hold on, přidám nějaký text navíc o těchto věcech .
  • jste geniální a děláte to, co jsem chtěl dělat … děkuji, pane !!

odpověď

Pomocí awk vyberte své první a další příslušné pole.

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

Komentáře

  • Toto ještě ' nereflektuje provádění příkazu ani použití portů. Do budoucna, když budou otázky procházet těžkými komentáři a úpravami, navrhuji ' d počkat, než se požadavky usadí, než se pokusíme odpovědět.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *