Reducir sólo una parte específica de un comando de salida de bash

Reducir sólo una parte específica de un comando de salida de bash

Tengo un programa simple al que llamo ipsweep. Todo lo que se supone que debe hacer es hacer ping a una dirección IP y mostrar las IP en uso.

Esto es lo que hice la primera vez:

#!/bin/bash
for ip in {1...254}; do
ping -c 1 $1.$ip
done

Funcionó, pero muestra información que no necesito. Todo lo que necesito son las direcciones IP en uso. Mostró todo esto con cada IP:

ingrese la descripción de la imagen aquí

Entonces intenté agregar algunos filtros como| grep "ping" | cut -d " " -f 2

#!/bin/bash
for ip in {1...254}; do
ping -c 1 $1.$ip | grep "ping" | cut -d " " -f 2 &
done

Ahora la consola muestra solo las IP, pero muestra TODAS las IP, sin importar si están en usuario o no (solo necesito las que están en uso, repito). Llevo 5 horas intentando solucionar esto, pero sigo sin poder. Sé que con un si esto se podría solucionar, pero no sé cómo escribirlo.

ingrese la descripción de la imagen aquí

Respuesta1

Usando el código de salida de ping para determinar si el host está vivo:

#!/bin/bash
for ip in {1..254}; do
  ping -q -c 1 $1.$ip >2 2>&- && printf %s.%s\\n $1 $ip
done

Respuesta2

En primer lugar, no es aconsejable comprobar la conectividad con un solo paquete, pero:

# IP address 192.168.100.1 exists, 192.168.100.122 does not.
walt@bat:~(0)$ ping -c 1 192.168.100.1
PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data.
64 bytes from 192.168.100.1: icmp_seq=1 ttl=63 time=2.76 ms

--- 192.168.100.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 2.763/2.763/2.763/0.000 ms
walt@bat:~(0)$ ping -c 1 192.168.100.122
PING 192.168.100.122 (192.168.100.122) 56(84) bytes of data.

--- 192.168.100.122 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

Tanto los ejemplos de éxito como los de fracaso contienen la --- 192.168.100.122 ping statistics ---línea " " con la que estás detectando grep ping.

Podrías hacerlo grep ", 0% packet loss"en su lugar.

información relacionada