[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: como sacar ciertos ip de un txt



El mié., 28 nov. 2018 a las 20:52, Hector Colina (<hcolina@gmail.com>) escribió:

> Hola. grep te servirá sólo para una parte, no para todo lo que necesitas.
>
> Extraer patrones de un texto requiere examinar el texto para encontrar
> elementos comunes que puedan utilizarse en la estrategia a seguir.
>
> En este caso, veo que las líneas donde aparece una dirección IP tienen
> el texto IP así que ese será mi primer patrón a utilizar
>
> cat foo | grep IP
>
> asumo acá que el archivo donde tienes los logs se llama foo. Este
> filtro debería arrojar algo como:
>
> [8] logins from IP  132.245.51.221 []
> [   3] logins from IP  152.231.32.255 []
>
> Luego, necesito extraer sólo la ip de esa salida, el problema es que
> tienes unos espacios extras en el corchete, lo que confundirá
> cualquier filtro extra, por ejemplo usando awk y diciéndole que
> imprima el campo 5, que es donde está la ip de la primera línea, te
> dará un error:
>
> cat foo |grep IP | awk '{print $5}'
> 132.245.51.221
> IP
>
> Ya que el 5 campo en la segunda línea corresponde a la columna IP, se
> cuenta el [ como el primer campo columna por el espacio.
>
> En este caso, es necesario normalizar los campos para poder extraer la
> información, así que acá, hay que leer el manual de bash para poder
> encontrar lo que necesitamos.
>
> Lo primero es la orden tr (man tr) para remover espacios extras, quedando así:
>
> cat foo |grep IP  |tr -s "[:blank:]"
> [8] logins from IP 132.245.51.221 []
> [ 3] logins from IP 152.231.32.255 []
>
> Pero, si te fijas, aun existe un espacio extra en la segunda línea
> entre el corchete y el número 3, así que lo remuevo con algo como:
>
> cat foo |grep IP  |tr -s "[:blank:]" | sed 's/\[ /\[/'
>
> Acá hay un poco de expresiones regulares para poder colocar el
> caracter especial [ en bash, ya que sino, el sistema espera otra
> instrucción
>
> Esta orden da como salida:
>
> cat foo |grep IP  |tr -s "[:blank:]" | sed 's/\[ /\[/'
> [8] logins from IP 132.245.51.221 []
> [3] logins from IP 152.231.32.255 []
>
> Y allí  si están todas las columnas ordenadas y ahora, como sólo
> necesito las IP, pues..
>
> cat foo |grep IP  |tr -s "[:blank:]" | sed 's/\[ /\[/' | awk '{print $5}'
> 132.245.51.221
> 152.231.32.255
>
> awk al rescate para imprimir sólo la columna 5 lo que me devuelve las ip.
>
> Allí tienes la caña de pescar, úsala para el pez que se te presente.
>
> Sin más.
>
> P.D. en la lista quizás exista un "perlero" que haga todo eso en menos
> instrucciones, que para eso perl es en extremo potente, pero quize
> hacerlo en bash y, estoy seguro, que aun puede optimizarse mucho más y
> que, de muy probablemente, en la lista habrá alguien que lo pueda
> mejorar.
>
Hola hector  magistral la ayuda, no se si abuse un poco en la lista
para que alguien me ayudara hacer algo como esto , no soy muy bueno en
bash , y perl solo de oídas , pero probando la linea con awk que has
creado funciona , lo único que la condición es que saque los que
tienen mas de 8 intentos fallidos , el saca todos los ip de mi lista
ip.txt , después lo pasare a otra lista txt

el script que encontré por la red , esta escrito en perl y saca los
intentos fallidos de las cuentas de correos , ya sea por imap , pop ,
la idea es pasarlo a fail2ban - ipset

te pego la salida de esta lista en pastebin , creo que los espacios es
porque el script usa geoip para determinar el pais - localización .

Postdata: se podría excluir un rango como por ejemplo mi red local
:192.168.30.0/24

https://pastebin.com/bFBY8etQ

gracias x tu ayuda.


-- 
rickygm

http://gnuforever.homelinux.com


Reply to: