Cómo analizar un archivo csv con bash

Tengo un archivo CSV con direcciones IP y puertos abiertos:

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

Para cada dirección IP con un puerto abierto, necesito ejecutar un comando usando tanto la dirección IP como el número de puerto del puerto abierto (tomado del encabezado CSV).

Comentarios

  • ¿El comando que ejecute para cada IP con puertos abiertos tendrá que usar el número de puerto correspondiente? ¿Es el número de puerto el número que aparece en el encabezado de CSV?
  • @Kusalananda exactamente !!
  • y gracias por ayudarme a editar mi pregunta @Kusalananda y entendiste mi pregunta,
  • Yo ' pasaré esta pregunta en particular, gracias; pero si tuviera que responder, me gustaría saber qué comando está ' ejecutando, de modo que ' sepa cómo el puerto debe ser retratado. Creo que ' hará que la respuesta sea más útil para ti. Yo ' también tendría curiosidad si la cantidad de puertos posibles termina en 26 o podría llegar a 65.535. Además, ¿solo habrá un puerto abierto? ¿Podría haber cero o más de uno?
  • El comando @JeffSchaller es telnet y el número de puerto no es hasta 65,535 pero tengo más de 900 puertos y el estado cambiará cada vez que se realice el escaneo. lo que quiero lograr es verificar si hay alguna sesión de telnet activa escuchando, pero solo necesito la ayuda para elegir la IP y el número de puerto que está abierto

Responder

Resolver esto por completo en bash puro, creo que no sería aconsejable. Ver p. Ej. la pregunta « ¿Por qué el uso de un bucle de shell para procesar texto se considera una mala práctica? «.

En su lugar, hagamos los datos de entrada un poco más fácil de digerir.

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

Este comando awk leería primero los números de puerto de la primera línea de el archivo CSV en una matriz llamada port. El número de puerto para la columna N se almacenaría en port[N].

Para ello, divide la primera línea de la entrada entre comas y simplemente almacena el resultado en la matriz port. Esto es lo que split() comando lo hace. La condición FNR == 1 significa «Si esta es la primera línea del archivo, entonces haz esto …» (FNR es el número de línea en el archivo de entrada actual). Se ejecutará un bloque de código sin condición para cada línea de entrada.

Después de llamar a split(), , el separador de campo, se establece en una coma. Esto significa que las otras líneas del archivo se dividirán automáticamente en comas en campos. Esto se usa en el ciclo del segundo bloque para recorrer los campos CSV (desde el segundo campo hasta el último) en cada línea.

Para cada una de las otras filas de los datos, recorre los campos delimitados por comas y, cuando encuentra un campo cuyo valor es la cadena open, imprime la dirección IP (el primer campo) y el número de puerto correspondiente.

La salida de este comando, dados los datos de la pregunta es

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 

Esto se puede leer fácilmente mediante un bucle en el shell:

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

Esto lee la dirección IP y el número de puerto, uno por uno.

Para combinarlos en un script completo:

#!/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 salida del awk El comando se envía al bucle while que lee los valores y llama al comando (tenga en cuenta la línea | después del nombre del archivo de entrada).

Tenga en cuenta que si una dirección IP tiene más de un puerto abierto, el comando se ejecutará varias veces para esa dirección.

Comentarios

  • Dios mío, esto era lo que era tr y con ganas de hacer, esto es asombroso. Soy tonto. ¿Podrías ayudarme a entender esto más (me puedes decir en modo de depuración?)
  • @biniyamgetu Necesito saber exactamente lo que necesito explicar.
  • Hermano I Estoy muy agradecido, esto es muy útil … entonces, ¿qué está haciendo FNR == 1, luego veo split y qué es FS
  • @biniyamgetu Espera, agregaré un texto adicional sobre esas cosas .
  • usted es un genio y está haciendo lo que yo quería hacer … ¡¡Gracias señor !!

Responder

Seleccione su primer y siguiente campo respectivo usando awk.

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

Comentarios

  • Esto no ' todavía aborda la ejecución de un comando o el uso de los puertos. Para el futuro, cuando las preguntas se sometan a muchos comentarios y modificaciones, ' sugeriría esperar a que se establezcan los requisitos antes de intentar una respuesta.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *