Linux: Poder de Bash, Grep, AWK

Si eres un pipiri en linux, te vas a aburrir con esto. Ya con 2 meses o quizas un poco mas de vivir 100% linux, empiezo a probar por mi mismo cosas que recuerdo haber visto en los .bash_history de la cuenta del administrador en mi universidad, ya hace mas de 5 anos.

Algo que domine en diciembre fue grep, y ahora no puedo vivir sin grep, deberia hacer una franela que diga:

“Grep! How can you live without it?”

Nuevo Truquito de Bash:
Escribe en el bash sin que vean lo que escribes
Este lo aprendi por ensayo y error. Muchas veces me pasaba que estaba haciendo algo en bash, y por costumbre aveces pisaba Ctrl+X Ctrl+S… ticks nerviosos de andar siempre salvando.

Esto causaba que bash se “guindara”, segun lo que yo percibia. Pero despues pense, eso quizas no es que se guinda, quizas es una especie de bloqueo de la ventana… asi que empeze a tocar varias combinaciones de teclas, y cuando presione Ctrl+Q, se mostraron todas las teclas que habia pisado antes.

Entonces, si quieres escribir algo mientras, y tienes a alguien al lado y no quieres que vea, pero no quieres perder el tiempo, Presiona Ctrl+S, sigue escribiendo tu comando, y cuando se vaya, presiona Ctrl+Q, y todo estara alli esperando por ti.


Viendo el log de Apache Rapidamente

Acabo de hacer un comandito, que me permite ver rapidamente todas las visitas a una pagina que me interesa, excluyendo mis visitas.

Ver las entradas completas de apache a veces es un fastidio pq no caben en la pantalla, asi que quieres formatear un poco la salida de tu
cat /var/log/apache2/acess_log | grep expresion

pq eso solo filtrara, pero seguiras viendo todo.

Una forma de editar el texto que sale en stdin, es utilizando un Text Stream Editor, o utilizar AWK.

Supon que ejecutas un comando en el shell, y devuelve

columna1 columna2 columna3 columna4
columna1 columna2 columna3 columna4
columna1 columna2 columna3 columna4
columna1 columna2 columna3 columna4

Y tu solo quieres ver de ahi, la columna 1 y la columna 4.

haces esto

[usuario]$ micomando | awk {‘print $1 $4’}
columna1 columna4
columna1 columna4
columna1 columna4
columna1 columna4

Si quieres ahora formatear mejor esa salida, puedes hacer algo asi:

[usuario]$ micomando | awk {‘print “col1: ” $1 “ncol4: ” $4 “n” ‘}
col1: columna1
col4: columna4

col1: columna1
col4: columna4

col1: columna1
col4: columna4

col1: columna1
col4: columna4


Combinando todo para ver el log de Apache

En mi caso quiero ver quien se ha interesado por ver el codigo fuente del script de Thumbnails que publique hace 2 dias aqui en el blog.

http://dev.wedoit4you.com/images/autoshow2005/index.php?show_source=1

Si se fijan en la URL de arriba, mi script se le pasa un parametro llamado “show_source”, esta va a ser la aguja en el pajar.

Mi secuencia de comandos para filtrar el log de apache es algo asi:


cat /var/log/apache2/access_log | grep -v “69.141.68.127” | grep -v “127.0.0.1” | grep show_source | awk {‘print $1 ” ” $4 ” ” $13 ” ” $14 ” ” $15 ” ” $16 ” ” $17 ” ” $18 ” ” $19 ” ” $20 ” ” $21 “nPage: ” $7 ” n” “Referer:n” $11 “n “‘}

Explico el comando, si no saben para que es el “|”, eso es lo que llamamos PIPE, la traduccion literal es TUBO, Tuberia… por la cual se pasa la salida de el comando a la izquierda, al comando de la derecha.

comandoIzq | comandoDer

El comando de la Izq se ejecuta, la salida de este comando se le da al comando de la derecha del pipe para que este haga su trabajo.

Desglosemos el comando de arriba

cat /var/log/apache2/access_log |
cat imprime en stdout el contenido de un archivo, tambien sirve para escribir dentro de un archivo, pero eso es otra historia. Aqui estoy imprimiendo a stdout el contenido de mi log de apache.

grep -v “69.141.68.127” |
grep -v “127.0.0.1” |

Luego utilizo grep pero con el flag “-v”, el cual excluye todas las lineas que contengan la expresion. Esto lo hago con el IP de mi maquina, y el localhost. Pq no me interesan mis visitas.

grep show_source |
Ahora, de las lineas sobrantes, me interesan aquellas que tienen la aguja mencionada antes, todas aquellas entradas que tengan “show_source” son las que me interesan.

Hasta este punto el comando esta listo, pero se ve muy engorroso en la pantalla para ojos no entrenados. Si quieres hacer algo mas amigable
debes usar un stream editor como awk

awk {‘print $1 ” ” $4 ” ” $13 ” ” $14 ” ” $15 ” ” $16 ” ” $17 ” ” $18 ” ” $19 ” ” $20 ” ” $21 “nPage: ” $7 ” n” “Referer:n” $11 “n “‘}

Awk mete todas las palabras separadas por espacios en variables que empiezan desde $1 $2 $3 $4, el log de apache separa sus entradas por espacios, entonces es cuestion de fijarte un poco como es la sintaxis del comando para que entiendas lo que hice. Imprimo en cada pasada las columnas que me interesan, IP de origen, Fecha, Sistema Operativo, Navegador, Idioma, Version, La Pagina que estoy viendo, y la pagina que refirio la visita.

Lo ideal con un comando tan largo como este, no es que lo escribas cada vez que quieras examinar el log, sino que lo metas en un archivo, y lo conviertas en un script. Puede ser un script bash preferiblemente, o un script en perl, php, o el lenguaje de tu preferencia.

Supongamos que llamamos el script, filtro_log_apache

Este seria el codigo


#!/bin/bash

#configuracion del script
ruta_apache=/var/log/apache2/access_log
ip_externo=69.141.68.127
#aqui va lo que mete el usuario, este $1
#lo puedes poner abajo directamente, esta
#aqui por propositos ilustrativos
aguja=$1


cat $ruta_apache | grep -v $ip_externo | grep -v “127.0.0.1” | grep $aguja | awk {‘print $1 ” ” $4 ” ” $13 ” ” $14 ” ” $15 ” ” $16 ” ” $17 ” ” $18 ” ” $19 ” ” $20 ” ” $21 “nPage: ” $7 ” n” “Referer:n” $11 “n “‘}

Guarda tu archivo y recuerda ponerle permisos de ejecucion con chmod 775 filtro_apache_log

Cambia las variables a lo que tienes en tu servidor, y asegurate que el comando el script que acabas de ejecutar este en el PATH de ejecucion de tu shell.

Una corrida por ejemplo buscando las entradas por “macaco” para mis videos donde salgo haciendo Macaco en Capoeira, genera una salida asi:

[user:~/> filtro_log_apache macaco
69.19.229.88 [01/Apr/2005:03:16:15 [en](Win95;I)”
Page: /videos_marzo/3macacos_lado_march_05.avi
Referer:
“http://newgenfilms.com/drupal/”

69.19.229.88 [01/Apr/2005:03:16:16 [en](Win95;I)”
Page: /videos_marzo/3macacos_frente_march05.avi
Referer:
“http://newgenfilms.com/drupal/”

201.128.242.204 [01/Apr/2005:14:48:19 (compatible; MSIE 6.0; Windows 98)”
Page: /videos_marzo/kicks_macacos_march_05.avi
Referer:
“-“

80.58.36.44 [02/Apr/2005:17:25:16 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90)”
Page: /videos_marzo/kicks_macacos_march_05.avi
Referer:
“http://wedoit4you.com/blog/index.php?s=Zoologico&sentence=AND&submit=Buscar”

80.58.36.44 [02/Apr/2005:17:25:34
Page: /videos_marzo/kicks_macacos_march_05.avi
Referer:
“-“

80.58.36.44 [02/Apr/2005:17:25:40 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90)”
Page: /videos_marzo/kicks_macacos_march_05.avi
Referer:
“-“

67.103.202.137 [03/Apr/2005:01:07:54 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0″
Page: /videos_marzo/3macacos_lado_march_05.avi
Referer:
“-“

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.