Cum se analizează fișierul CSV cu bash

Am fișier CSV cu adrese IP și porturi deschise:

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

Pentru fiecare adresă IP cu un port deschis, trebuie să execut o comandă folosind atât adresa IP, cât și numărul de port al portului deschis (preluat din antetul CSV).

Comentarii

  • Comanda pe care o executați pentru fiecare IP cu porturi deschise va trebui să utilizeze numărul portului corespunzător? Numărul portului este numărul listat în antetul CSV?
  • @Kusalananda exact !!
  • și vă mulțumesc că m-ați ajutat să editez întrebarea mea @Kusalananda și ați înțeles întrebarea mea,
  • ' voi transmite această întrebare specială, vă mulțumesc; dar dacă ar fi să răspund, aș vrea să știu ce comandă executați ', astfel încât să ' să clarifice modul în care portul ar trebui să fie portretizat. Cred că ' vă va face răspunsul mai util. ' aș fi curios, de asemenea, dacă numărul de porturi posibile se termină la 26 sau poate ajunge până la 65.535? De asemenea, ar exista vreodată unul port deschis? Ar putea fi zero sau mai multe decât una?
  • Comanda @JeffSchaller este telnet, iar numărul portului nu este până la 65.535, dar am mai mult de 900 de porturi și starea se va schimba de fiecare dată cu scanarea. ceea ce vreau să realizez este să verific dacă există o ascultare activă a sesiunii telnet, dar am nevoie doar de ajutor în alegerea numărului IP și a portului care este deschis

Răspuns

Rezolvarea acestei competențe în bash pură, nu cred, ar fi recomandabilă. Vezi de ex. întrebarea „ De ce este folosită o buclă shell pentru procesarea textului o practică greșită? „.

În schimb, să facem datele de intrare un pic mai ușor de digerat.

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

Această comandă awk ar citi mai întâi numerele porturilor din prima linie a fișierul CSV într-o matrice numită port. Numărul portului pentru coloana N ar fi stocat în port[N].

Face acest lucru împărțind prima linie a intrării pe virgule și stocând pur și simplu rezultatul în matricea port. Aceasta este ceea ce split() o face. Condiția FNR == 1 înseamnă „Dacă aceasta este prima linie a fișierului, atunci faceți asta …” (FNR este numărul liniei din fișierul de intrare curent). Pentru fiecare linie de intrare va fi executat un bloc de cod fără condiție.

După apelarea split(), , separatorul de câmp, este setat la virgulă. Aceasta înseamnă că celelalte linii din fișier vor fi împărțite automat prin virgule în câmpuri. Aceasta este utilizată în bucla din al doilea bloc pentru a trece peste câmpurile CSV (de la al doilea câmp până la ultimul) de pe fiecare linie.

Pentru fiecare dintre celelalte rânduri din date, acesta trece prin câmpurile delimitate de virgule și când găsește un câmp a cărui valoare este șirul open, imprimă adresa IP (primul câmp) și numărul portului corespunzător.

Ieșirea din această comandă, având în vedere datele din întrebare este

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 

Acest lucru poate fi citit cu ușurință de o buclă din shell:

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

Aceasta citește adresa IP și numărul portului, unul câte unul.

Pentru a le combina într-un script complet:

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

Ieșirea awk comanda este conectată la bucla while care citește valorile și apelează comanda (rețineți conducta | după numele fișierului de intrare).

Rețineți că dacă o adresă IP are mai multe porturi deschise, comanda va fi executată de mai multe ori pentru acea adresă.

Comentarii

  • OMG asta a fost ceea ce am fost tr Da, asta este uimitor. Sunt prost Pot să mă ajuți, te rog, să înțeleg asta mai mult (îmi poți spune în modul de depanare?) sunt foarte recunoscător, acest lucru este atât de util … deci, ce face FNR == 1, apoi văd împărțit și ce este FS
  • @biniyamgetu Stai, voi adăuga un text suplimentar despre acele lucruri .
  • sunteți genial și face ceea ce am vrut să fac … Vă mulțumesc, domnule !!

Răspundeți

Selectați primul și următorul câmp respectiv folosind awk.

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

Comentarii

  • Aceasta nu este încă ' adresată încă executând o comandă sau utilizând porturile. Pentru viitor, când întrebările sunt supuse unor comentarii și editări intense, ' sugerez să așteptăm ca cerințele să se stabilească înainte de a încerca un răspuns.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *