Post by Rick GutierrezHola 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