Tengo una larga lista de direcciones IP, que no están en secuencia. Necesito encontrar cuántas direcciones IP hay antes / después de una dirección IP en particular. ¿Cómo puedo conseguir esto?
shell-script
text-processing
Mandar Shinde
fuente
fuente
Respuestas:
Número de líneas antes y después de una coincidencia, incluida la coincidencia (es decir, debe restar 1 del resultado si desea excluir la coincidencia):
Pero esto no tiene nada que ver con las direcciones IP en particular.
fuente
Quizás lo más fácil es,
Gracias @JoshepR por señalar el error
fuente
dc
; probablemente lo dirija directamente a mí mismo, probablemente.Lo hice de dos maneras, aunque creo que me gusta más:
Eso los guarda a todos como variables de shell actuales, y luego los evalúa en el ciclo for para la salida. Cuenta el total de líneas en el archivo
wc
y obtiene el primer número de línea coincidente consed
.Su salida:
Yo también hice:
sed
imprime solo los números coincidentes y de la última línea, luegotr
traduce las\n
líneas electrónicas intermedias a, yread
lee el primero desed
los resultados en$ml
y todos los demás en$ll
. Los posibles casos de coincidencias múltiples se manejan eliminando todos los resultados, excepto el último, de$ll
la expansión cuando se configura de nuevo más tarde.Su salida:
Ambos métodos fueron probados en el archivo generado de la siguiente manera:
Lo hace, por número de línea:
"$IP"
luego una línea\n
electrónicatr
- que traduce ceros a\n
líneas de flujo y luego~/file
fuente
Aquí hay un poco de código Perl que lo hace:
Esto cuenta el número total de líneas antes y después de la línea que contiene la IP
192.168.1.1
. Reemplace con su IP deseada.Usando nada más que Bash:
fuente
$.
lugar de un contador?$after
a$. - $before
.$. - 1
, guarde$.
en$tmp
. Fin de impresión$. - $tmp
. Por lo tanto, no necesitamos un contador para ambos antes y después. Por supuesto, es menos legible que el tuyo.Estaba probando los siguientes comandos, que son un poco complicados, pero darían resultados precisos:
Después:
Antes de:
fuente
Una
awk
solución que informa el número de líneas antes y después del último partidofuente
Grep
tiene una función que puede contar la cantidad de veces que se encuentra un patrón en particular. Si usa el-c
comando, lo hará. Con el comando-c
y-v
, esto contará cuántas veces esto no coincide con un patrón en particularEjemplo:
grep -c -v <pattern> file
Entonces, si intentas algo como:
grep -c -v 192.168.x.x file.log
eso debería funcionar.fuente