{"id":130,"date":"2005-04-03T21:28:39","date_gmt":"2005-04-04T04:28:39","guid":{"rendered":"http:\/\/www.gubatron.com\/blog\/?p=130"},"modified":"2005-04-03T21:28:39","modified_gmt":"2005-04-04T04:28:39","slug":"linux-poder-de-bash-grep-awk","status":"publish","type":"post","link":"https:\/\/www.gubatron.com\/blog\/linux-poder-de-bash-grep-awk\/","title":{"rendered":"Linux: Poder de Bash, Grep, AWK"},"content":{"rendered":"\n<p>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.<\/p>\n<p>Algo que domine en diciembre fue grep, y ahora no puedo vivir sin grep, deberia hacer una franela que diga:<\/p>\n<p>&#8220;Grep! How can you live without it?&#8221;<\/p>\n<p>Nuevo Truquito de Bash:<br \/>\n<strong>Escribe en el bash sin que vean lo que escribes<\/strong><br \/>\nEste 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&#8230; ticks nerviosos de andar siempre salvando.<\/p>\n<p>Esto causaba que bash se &#8220;guindara&#8221;, segun lo que yo percibia. Pero despues pense, eso quizas no es que se guinda, quizas es una especie de bloqueo de la ventana&#8230; asi que empeze a tocar varias combinaciones de teclas, y cuando presione Ctrl+Q, se mostraron todas las teclas que habia pisado antes.<\/p>\n<p>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.<\/p>\n<p>&#8212;<br \/>\n<strong>Viendo el log de Apache Rapidamente<\/strong><\/p>\n<p>Acabo de hacer un comandito, que me permite ver rapidamente todas las visitas a una pagina que me interesa, excluyendo mis visitas.<\/p>\n<p>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<br \/>\ncat \/var\/log\/apache2\/acess_log | grep expresion<\/p>\n<p>pq eso solo filtrara, pero seguiras viendo todo.<\/p>\n<p>Una forma de editar el texto que sale en stdin, es utilizando un Text Stream Editor, o utilizar AWK.<\/p>\n<p>Supon que ejecutas un comando en el shell, y devuelve<\/p>\n<p>columna1 columna2 columna3 columna4<br \/>\ncolumna1 columna2 columna3 columna4<br \/>\ncolumna1 columna2 columna3 columna4<br \/>\ncolumna1 columna2 columna3 columna4<\/p>\n<p>Y tu solo quieres ver de ahi, la columna 1 y la columna 4.<\/p>\n<p>haces esto<\/p>\n<p>[usuario]$ micomando | awk {&#8216;print $1 $4&#8217;}<br \/>\ncolumna1 columna4<br \/>\ncolumna1 columna4<br \/>\ncolumna1 columna4<br \/>\ncolumna1 columna4<\/p>\n<p>Si quieres ahora formatear mejor esa salida, puedes hacer algo asi:<\/p>\n<p>[usuario]$ micomando | awk {&#8216;print &#8220;col1: &#8221; $1 &#8220;ncol4: &#8221; $4 &#8220;n&#8221; &#8216;}<br \/>\ncol1: columna1<br \/>\ncol4: columna4<\/p>\n<p>col1: columna1<br \/>\ncol4: columna4<\/p>\n<p>col1: columna1<br \/>\ncol4: columna4<\/p>\n<p>col1: columna1<br \/>\ncol4: columna4<\/p>\n<p>&#8212;<br \/>\n<strong>Combinando todo para ver el log de Apache<\/strong><\/p>\n<p>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.<\/p>\n<p><a href=\"http:\/\/dev.wedoit4you.com\/images\/autoshow2005\/index.php?show_source=1\">http:\/\/dev.wedoit4you.com\/images\/autoshow2005\/index.php?show_source=1<\/a><\/p>\n<p>Si se fijan en la URL de arriba, mi script se le pasa un parametro llamado &#8220;show_source&#8221;, esta va a ser la aguja en el pajar.<\/p>\n<p>Mi secuencia de comandos para filtrar el log de apache es algo asi:<\/p>\n<p><b><br \/>\ncat \/var\/log\/apache2\/access_log | grep -v &#8220;69.141.68.127&#8221; | grep -v &#8220;127.0.0.1&#8221; | grep show_source | awk {&#8216;print $1 &#8221; &#8221; $4 &#8221; &#8221; $13 &#8221; &#8221; $14 &#8221; &#8221; $15 &#8221; &#8221; $16 &#8221; &#8221; $17 &#8221; &#8221; $18  &#8221; &#8221; $19 &#8221; &#8221; $20 &#8221; &#8221; $21 &#8220;nPage: &#8221; $7 &#8221; n&#8221;  &#8220;Referer:n&#8221; $11 &#8220;n &#8220;&#8216;}<br \/>\n<\/b><\/p>\n<p>Explico el comando, si no saben para que es el &#8220;|&#8221;, eso es lo que llamamos PIPE, la traduccion literal es TUBO, Tuberia&#8230; por la cual se pasa la salida de el comando a la izquierda, al comando de la derecha. <\/p>\n<p>comandoIzq | comandoDer<\/p>\n<p>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.<\/p>\n<p>Desglosemos el comando de arriba<\/p>\n<p><b>cat \/var\/log\/apache2\/access_log | <\/b><br \/>\ncat 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.<\/p>\n<p><b>grep -v &#8220;69.141.68.127&#8221; |<br \/>\ngrep -v &#8220;127.0.0.1&#8221; | <\/b><br \/>\nLuego utilizo <strong>grep<\/strong> pero con el flag &#8220;-v&#8221;, 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.<\/p>\n<p><b>grep show_source | <\/b><br \/>\nAhora, de las lineas sobrantes, me interesan aquellas que tienen la aguja mencionada antes, todas aquellas entradas que tengan &#8220;show_source&#8221; son las que me interesan.<\/p>\n<p>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<br \/>\ndebes usar un stream editor como awk<\/p>\n<p><b>awk {&#8216;print $1 &#8221; &#8221; $4 &#8221; &#8221; $13 &#8221; &#8221; $14 &#8221; &#8221; $15 &#8221; &#8221; $16 &#8221; &#8221; $17 &#8221; &#8221; $18  &#8221; &#8221; $19 &#8221; &#8221; $20 &#8221; &#8221; $21 &#8220;nPage: &#8221; $7 &#8221; n&#8221;  &#8220;Referer:n&#8221; $11 &#8220;n &#8220;&#8216;} <\/b><\/p>\n<p>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.<\/p>\n<p>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.<\/p>\n<p>Supongamos que llamamos el script, filtro_log_apache<\/p>\n<p>Este seria el codigo<\/p>\n<p><b><br \/>\n#!\/bin\/bash<\/p>\n<p>#configuracion del script<br \/>\nruta_apache=\/var\/log\/apache2\/access_log<br \/>\nip_externo=69.141.68.127<br \/>\n#aqui va lo que mete el usuario, este $1<br \/>\n#lo puedes poner abajo directamente, esta<br \/>\n#aqui por propositos ilustrativos<br \/>\naguja=$1<br \/>\n<\/b><\/p>\n<p><b><br \/>\ncat $ruta_apache | grep -v $ip_externo | grep -v &#8220;127.0.0.1&#8221; | grep $aguja | awk {&#8216;print $1 &#8221; &#8221; $4 &#8221; &#8221; $13 &#8221; &#8221; $14 &#8221; &#8221; $15 &#8221; &#8221; $16 &#8221; &#8221; $17 &#8221; &#8221; $18  &#8221; &#8221; $19 &#8221; &#8221; $20 &#8221; &#8221; $21 &#8220;nPage: &#8221; $7 &#8221; n&#8221;  &#8220;Referer:n&#8221; $11 &#8220;n &#8220;&#8216;}<br \/>\n<\/b><\/p>\n<p>Guarda tu archivo y recuerda ponerle permisos de ejecucion con <strong>chmod 775 filtro_apache_log<\/strong><\/p>\n<p>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.<\/p>\n<p>Una corrida por ejemplo buscando las entradas por &#8220;macaco&#8221; para mis videos donde salgo haciendo Macaco en Capoeira, genera una salida asi:<\/p>\n<p>[user:~\/&gt; filtro_log_apache macaco<br \/>\n69.19.229.88 [01\/Apr\/2005:03:16:15 [en](Win95;I)&#8221;<br \/>\nPage: \/videos_marzo\/3macacos_lado_march_05.avi<br \/>\nReferer:<br \/>\n&#8220;http:\/\/newgenfilms.com\/drupal\/&#8221;<\/p>\n<p>69.19.229.88 [01\/Apr\/2005:03:16:16 [en](Win95;I)&#8221;<br \/>\nPage: \/videos_marzo\/3macacos_frente_march05.avi<br \/>\nReferer:<br \/>\n&#8220;http:\/\/newgenfilms.com\/drupal\/&#8221;<\/p>\n<p>201.128.242.204 [01\/Apr\/2005:14:48:19 (compatible; MSIE 6.0; Windows 98)&#8221;<br \/>\nPage: \/videos_marzo\/kicks_macacos_march_05.avi<br \/>\nReferer:<br \/>\n&#8220;-&#8220;<\/p>\n<p>80.58.36.44 [02\/Apr\/2005:17:25:16 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90)&#8221;<br \/>\nPage: \/videos_marzo\/kicks_macacos_march_05.avi<br \/>\nReferer:<br \/>\n&#8220;http:\/\/wedoit4you.com\/blog\/index.php?s=Zoologico&amp;sentence=AND&amp;submit=Buscar&#8221;<\/p>\n<p>80.58.36.44 [02\/Apr\/2005:17:25:34<br \/>\nPage: \/videos_marzo\/kicks_macacos_march_05.avi<br \/>\nReferer:<br \/>\n&#8220;-&#8220;<\/p>\n<p>80.58.36.44 [02\/Apr\/2005:17:25:40 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90)&#8221;<br \/>\nPage: \/videos_marzo\/kicks_macacos_march_05.avi<br \/>\nReferer:<br \/>\n&#8220;-&#8220;<\/p>\n<p>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&#8243;<br \/>\nPage: \/videos_marzo\/3macacos_lado_march_05.avi<br \/>\nReferer:<br \/>\n&#8220;-&#8220;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[33],"tags":[],"class_list":["post-130","post","type-post","status-publish","format-standard","hentry","category-gubatron"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5Unzf-26","jetpack-related-posts":[{"id":63,"url":"https:\/\/www.gubatron.com\/blog\/vaciando-el-buffer\/","url_meta":{"origin":130,"position":0},"title":"Vaciando el Buffer","author":"gubatron","date":"December 10, 2004","format":false,"excerpt":"Este post es un poco para desahogar algunos consejos y tips que he querido tener anotados, y que mejor lugar que el blog, donde mis notas personales pueden ayudar a otros. En mi \u00faltimas asignaciones profesionales he tenido que trabajar en ambientes 100% Linux, esto me ha hecho refrescar viejas\u2026","rel":"","context":"In &quot;Gubatron&quot;","block_context":{"text":"Gubatron","link":"https:\/\/www.gubatron.com\/blog\/category\/gubatron\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":582,"url":"https:\/\/www.gubatron.com\/blog\/linuxcomo-copiar-un-archivo-a-multiples-ubicaciones-con-un-solo-comando\/","url_meta":{"origin":130,"position":1},"title":"Linux: Como copiar un archivo a multiples ubicaciones con un solo comando","author":"gubatron","date":"August 29, 2007","format":false,"excerpt":"Aprovecho la ocasion para ilustrar un poco el poder del bash a los amigos que recien se unen al mundo de linux. Muchas veces tienes que hacer operaciones en las cuales tienes que tocar multiples archivos, por ejemplo, remplazar un archivo en varios lugares. Yendo a un ejemplo concreto, El\u2026","rel":"","context":"In &quot;Geeklife&quot;","block_context":{"text":"Geeklife","link":"https:\/\/www.gubatron.com\/blog\/category\/geeklife\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":507,"url":"https:\/\/www.gubatron.com\/blog\/como-saber-que-programa-esta-ocupando-tus-recursos-de-sonido-como-matar-varios-procesos-relacionados-sin-hacer-kill-9-a-mano\/","url_meta":{"origin":130,"position":2},"title":"Como saber que programa esta ocupando tus recursos de sonido. Como matar varios procesos relacionados sin hacer kill -9 a mano","author":"gubatron","date":"April 23, 2007","format":false,"excerpt":"Aprovecho y doy 2 consejos. Cuando Amarok, o XMMS no te quieren funcionar, y no ves ningun proceso que este relacionado en top, matas todo... firefox, xmms, amarok, y aun nada.... la solucion es lsof. Intenta hacer esto: lsof | grep alsa Aparecera una lista de procesos y te muestra\u2026","rel":"","context":"In &quot;Code&quot;","block_context":{"text":"Code","link":"https:\/\/www.gubatron.com\/blog\/category\/code\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2202,"url":"https:\/\/www.gubatron.com\/blog\/have-the-latest-haproxy-as-a-ubuntu-service\/","url_meta":{"origin":130,"position":3},"title":"Have the latest HAProxy as a Ubuntu Service","author":"gubatron","date":"April 6, 2011","format":false,"excerpt":"So you need to use HAProxy and you love the convenience of binary packages on repos, but when you install the version HAProxy available in the repos you realize that it is way too old for what you need. Then you download the latest HAProxy, compile it, configure it, but\u2026","rel":"","context":"In &quot;Code&quot;","block_context":{"text":"Code","link":"https:\/\/www.gubatron.com\/blog\/category\/code\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2722,"url":"https:\/\/www.gubatron.com\/blog\/add-ssh-identities-to-your-ssh-agent-when-you-start-your-bash-session\/","url_meta":{"origin":130,"position":4},"title":"add ssh identities to your ssh agent when you start your bash session","author":"gubatron","date":"April 28, 2012","format":false,"excerpt":"Put this somewhere on your .bash_profile [bash] function addSSHIdentities() { pushd ~\/.ssh #add all your keys here ssh-add some_private_key ssh-add some_private_key_2 ssh-add some_private_key_3 ... ssh-add some_private_key_N popd } function startSSHAgent() { SSH_AGENT_PROCESSES=`ps aux | grep ssh-agent | grep -v grep | wc -l` if [ $SSH_AGENT_PROCESSES -gt 0 ] then\u2026","rel":"","context":"In \"posix\"","block_context":{"text":"posix","link":"https:\/\/www.gubatron.com\/blog\/tag\/posix\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":360,"url":"https:\/\/www.gubatron.com\/blog\/como-matar-varios-procesos-cuando-killall-no-es-una-opcion\/","url_meta":{"origin":130,"position":5},"title":"Como matar varios procesos cuando killall no es una opcion.","author":"gubatron","date":"August 15, 2006","format":false,"excerpt":"A veces tienes un cronjob que se queda pegado por mucho rato, cuando haces Code: ps aux | grep miPrograma tienes un monton de instancias pegadas!! Intentas hacer killall miPrograma pero no funciona porque quizas es un programa que estas arrancando con un interprete, como python, o php, o perl.\u2026","rel":"","context":"In &quot;Geeklife&quot;","block_context":{"text":"Geeklife","link":"https:\/\/www.gubatron.com\/blog\/category\/geeklife\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/posts\/130","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/comments?post=130"}],"version-history":[{"count":0,"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/posts\/130\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/media?parent=130"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/categories?post=130"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/tags?post=130"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}