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