El 28/11/18, Rick Gutierrez <xserverli...@gmail.com> escribió:
> Hola lista , tengo un script que me saca los intentos fallidos de mis
> cuentas de correo , este script lo paso a un txt , y de ahi necesito
> sacar a otro txt que el ip que cumpla con 8 intentos fallidos o mas se
> escriba en ese ultimo txt .
>
> el formato o la salida de los intentos fallidos es el siguiente.
>
>  [8] logins from IP  132.245.51.221 []
> Failed [   8] :  using pop  [   8]
>
> [   3] logins from IP  152.231.32.255 []
> Failed [   3] :  using pop  [   3]
>
> he intentando con grep , pero sin resultados.

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.

-- 
**********************************************
Hector Colina. Linux  counter id 131637
Debian user, aka e1th0r
Mérida-Venezuela http://colina.net.ve
Key fingerprint = E81B 8228 8919 EE27 85B7  A59B 357F 81F5 5CFC B481
LA REVOLUCIÓN NO SE HACE UNICAMENTE CON LAS ARMAS

Responder a