Comment analyser un fichier csv avec bash

Jai un fichier CSV avec des adresses IP et des ports ouverts:

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

Pour chaque adresse IP avec un port ouvert, je dois exécuter une commande en utilisant à la fois ladresse IP et le numéro de port du port ouvert (extrait de len-tête CSV).

Commentaires

  • La commande que vous exécutez pour chaque IP avec des ports ouverts devra-t-elle utiliser le numéro de port correspondant? Le numéro de port est-il le numéro indiqué dans len-tête CSV?
  • @Kusalananda exactement !!
  • et merci de mavoir aidé à modifier ma question @Kusalananda et vous avez compris ma question,
  • Je ' Je vais passer sur cette question particulière, merci; mais si je devais répondre, je voudrais savoir quelle commande vous ' exécutez, afin que ' s clair comment le port devrait être dépeint. Je pense que ' d rend la réponse plus utile pour vous. Je ' d également être curieux de savoir si le nombre de ports possibles se termine à 26 ou pourrait aller jusquà 65 535? De plus, ny aurait-il jamais quun un port ouvert? Pourrait-il y avoir zéro ou plus dun?
  • La commande @JeffSchaller est telnet et le numéro de port nest pas jusquà 65 535 mais jai plus de 900 ports et leur statut changera à chaque fois avec lanalyse. ce que je veux réaliser est de vérifier sil y a une session telnet active à lécoute, mais jai juste besoin daide pour choisir ladresse IP et le numéro de port ouverts

Réponse

Résoudre ce problème de manière compétitive en pure bash ne serait, je pense, pas souhaitable. Voir par exemple la question «  Pourquoi lutilisation dune boucle shell pour traiter du texte est-elle considérée comme une mauvaise pratique? « .

Au lieu de cela, créons les données dentrée un peu plus facile à digérer.

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

Cette commande awk lit dabord les numéros de port à partir de la première ligne de le fichier CSV dans un tableau appelé port. Le numéro de port de la colonne N serait stocké dans port[N].

Pour ce faire, il divise la première ligne de lentrée par des virgules et stocke simplement le résultat dans le tableau port. Cest ce que le split() fait. La condition FNR == 1 signifie « Sil sagit de la première ligne du fichier, alors faites ceci … » (FNR est le numéro de ligne dans le fichier dentrée courant). Un bloc de code sans condition sera exécuté pour chaque ligne dentrée.

Après avoir appelé split(), , le séparateur de champ, est défini sur une virgule. Cela signifie que les autres lignes du fichier seront automatiquement divisées par des virgules en champs. Ceci est utilisé dans la boucle du deuxième bloc pour boucler sur les champs CSV (du deuxième champ au dernier) sur chaque ligne.

Pour chacune des autres lignes des données, il parcourt les champs délimités par des virgules, et lorsquil trouve un champ dont la valeur est la chaîne open, il imprime ladresse IP (le premier champ) et le numéro de port correspondant.

Le résultat de cette commande, étant donné les données de la question est

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 

Ceci peut facilement être lu par une boucle dans le shell:

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

Ceci lit ladresse IP et le numéro de port, un par un.

Pour les combiner en 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 

La sortie de awk La commande est redirigée vers la boucle while qui lit les valeurs et appelle la commande (notez le tube | après le nom du fichier dentrée).

Notez que si une adresse IP a plus dun port ouvert, la commande sera exécutée plusieurs fois pour cette adresse.

Commentaires

  • OMG cétait ce que jétais tr ying to do, cest incroyable. Je suis stupide Pouvez-vous maider à comprendre cela davantage (pouvez-vous me dire en mode débogage?)
  • @biniyamgetu Jai besoin de savoir exactement ce que jai besoin dexpliquer.
  • Bro I je suis vraiment reconnaissant, cest si utile … alors, que fait FNR == 1, alors je vois split et quest-ce que FS
  • @biniyamgetu Attendez, je vais ajouter du texte supplémentaire sur ces choses .
  • vous êtes un génie, et il fait ce que je voulais faire … Merci monsieur !!

Réponse

Sélectionnez vos premier et suivant champs respectifs en utilisant awk.

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

Commentaires

  • Cela ne ' pas encore adresser lexécution dune commande ou lutilisation des ports. Pour lavenir, lorsque les questions sont soumises à de nombreux commentaires et modifications, je ' suggère dattendre que les conditions soient réglées avant de tenter une réponse.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *