Bash: Cómo imprimir una columna adicional que coincida con la dirección IP a nombre

Estoy usando netstat para recostackr información sobre las direcciones IP conectadas. Y tengo el siguiente formatting:

 netstat -tn 2>/dev/null | awk '/:80 / {print $5}' | sed 's/.*::ffff://' | sed 's/:.*//' | sor t | uniq -c | sort -nr 5 81.133.113.200 4 80.229.142.126 2 94.136.36.29 2 92.19.231.69 2 85.159.56.230 2 83.70.246.152 2 81.131.118.236 2 185.106.92.42 1 92.19.232.88 1 86.47.113.169 1 86.168.206.46 1 79.77.175.210 1 46.19.141.238 1 206.221.184.2 1 192.198.95.6 

Lo que estaba tratando de lograr es hacer coincidir una IP con un nombre de host.

Entonces, si tengo name=$(IPADDRESSNAME) almacenado en alguna parte y el nombre coincide con la dirección IP 81.133.113.200

Me gustaría imprimir en un formatting como ese:

  5 81.133.113.200 - IPADDRESSNAME 4 80.229.142.126 2 94.136.36.29 2 92.19.231.69 

He estado leyendo la columna para intentar hacer esto, pero no estoy seguro de cómo combinar ambas columnas con una coincidencia en la dirección.

Estoy ejecutando esto desde un script Bash, así que estaría almacenando los nombres de host allí.

Estaba pensando algo así como:

 string=$(netstat -tn 2>/dev/null | awk '/:80 / {print $5}' | sed 's/.*::ffff://' | sed 's/:.*//' | sort | uniq -c | sort -nr) if [[ $string == "81.133.113.200" ]] then echo "Its XXXXXXXX HOST"; fi 

Algo así como esto, aunque esto no funciona, la lógica es lo que estoy buscando pero en línea.

Pruebe esta versión probada:

 netstat -tn 2>/dev/null | awk '/:80 / {print $5}' | sed 's/.*::ffff://' | sed 's/:.*//' | sor t | uniq -c | sort -nr |\ while read index ipaddress ; do \ printf "%s " "${index}" ;\ getent hosts "${ipaddress}" ;\ if [ $? -eq 2 ]; then \ printf "%s\n" "${ipaddress}" ;\ fi ;\ done 

Está utilizando el getent estándar para consultar la database de los hosts a fin de recuperar el nombre de host dada su dirección IP.

La testing:

 5 81.133.113.200 host81-133-113-200.in-addr.btopenworld.com 4 80.229.142.126 garnerhome.plus.com 2 94.136.36.29 mail.e-trackit.co.uk 2 92.19.231.69 host-92-19-231-69.static.as13285.net 2 85.159.56.230 2 83.70.246.152 83-70-246-152-dynamic.b-ras1.prp.dublin.eircom.net 2 81.131.118.236 host81-131-118-236.range81-131.btcentralplus.com 2 185.106.92.42 1 92.19.232.88 host-92-19-232-88.static.as13285.net ... 

Olvidé que Sed puede usarse para anexar una línea y no solo para eliminar contenido. Así que utilicé Sed para ubicar la Cadena y anexar una línea después de ella. Bastante simple cuando lo piensas.

Creo que estaba complicando la situación con la salida en columnas

Simple un trazador de líneas como ejemplo:

  netstat -tn 2>/dev/null | awk '/:80 / {print $5}' | sed 's/.*::ffff://' | sed 's/:.*//' | sed '/8.8.8.8/s/$/ Its Google/' | sort | uniq -c | sort -nr 

Puede procesar el resultado línea por línea e imprimir según sus requisitos. Suponiendo que desea asignar direcciones a los nombres de host de / etc / hosts, podría hacer algo como esto:

 get_connected_hosts() { netstat -tn 2>/dev/null | awk '/:80 / {print $5}' | sed 's/.*::ffff://' | sed 's/:.*//' | sort | uniq -c | sort -nr } get_connected_hosts | while read line; do set -- $line result=$(grep $2 /etc/hosts | head -1 | awk '{ print $2 }') # or a reverse DNS lookup, result=$(dig +short -x $2) echo "$1 $2 - $result" done | column -t 
 netstat -tn | awk '/:80 / {print $5}' | sed -e 's/:.*//' | xargs -i sh -c 'echo {} $(getent hosts {})' | awk '$1 == $2 {print $2, $3; next}; {print}' | sort | uniq -c | sort -nr 

(Puede ser todo en una sola línea, he agregado line-feeds para evitar barras de desplazamiento horizontales y para que sea más legible)

Utiliza xargs -i (con implícita -L 1 ) para realizar una búsqueda de getent hosts antes de ejecutar el sort | uniq -c sort | uniq -c . Esto es más complicado de lo que debe ser, porque getent no produce ningún resultado si la búsqueda no devuelve nada, por lo que debemos asegurarnos de que la dirección IP se imprima haciendo echo antes del getent . El segundo awk se asegura de que solo se imprima una dirección IP por línea.

Otras alternativas serían usar nslookup , dig -x o host -i para hacer la búsqueda IP a nombre de host, pero todas requerirían aún más procesamiento de la salida.

el sed después de awk en la primera línea no es realmente necesario, podríamos hacer lo mismo usando la function gsub() awk para modificar $5 antes de imprimirlo, pero creo que hacerlo de esta manera es más legible y más fácil de entender.