{"id":85,"date":"2013-02-26T21:42:25","date_gmt":"2013-02-26T21:42:25","guid":{"rendered":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/?p=85"},"modified":"2013-02-26T21:42:25","modified_gmt":"2013-02-26T21:42:25","slug":"busqueda-dentro-de-textos","status":"publish","type":"post","link":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/busqueda-dentro-de-textos\/","title":{"rendered":"B\u00fasqueda dentro de textos"},"content":{"rendered":"<p><\/p>\n<h3>Grep<\/h3>\n<p>Ya hemos visto como podemos realizar b\u00fasquedas de ficheros con una amplia variedad de opciones. Sin embargo, a menudo es necesario tambi\u00e9n buscar dentro de un fichero (normalmente en ficheros de texto). Para ello podemos utilizar el comando\u00a0<em>grep<\/em>.<\/p>\n<p>Informalmente, podemos ver el uso del comando de la siguiente forma:<\/p>\n<p align=\"center\"><em>grep &lt;opciones de b\u00fasqueda&gt; &lt;cadena de texto a buscar&gt; &lt;ficheros&gt;<\/em><\/p>\n<p>Las opciones son optativas y aunque la especificaci\u00f3n de la cadena de texto a buscar admite descripciones muy complejas es posible utilizar\u00a0<em>grep<\/em>\u00a0de forma tan sencilla como sigue:<\/p>\n<pre>$ grep Calzado telefonos.txt\r\nCarlos Calzado 5550178<\/pre>\n<p>En este ejemplo hemos buscado la cadena \u00abCalzado\u00bb en el listado de tel\u00e9fonos que hicimos en un ejercicio anterior y\u00a0<em>grep<\/em>\u00a0nos devuelve la l\u00ednea del texto donde la encuentra. Esto puede resultar de gran utilidad si manejamos un fichero con un gran volumen de informaci\u00f3n.<\/p>\n<p>Podemos incluir m\u00e1s de un fichero en la b\u00fasqueda, como en el siguiente ejemplo:<\/p>\n<pre>$ grep Calzado telefonos.txt telef-may.txt\r\ntelefonos.txt:Carlos Calzado 5550178<\/pre>\n<p>Vemos que ahora la salida incluye el nombre del fichero donde se ha encontrado la cadena. Es interesante tambi\u00e9n comprobar que no la ha encontrado en el segundo fichero. La raz\u00f3n es que este \u00faltimo contiene los nombres en may\u00fasculas. Para indicarle al comando que no nos importa si la cadena est\u00e1 en may\u00fasculas o min\u00fasculas podemos usar la opci\u00f3n\u00a0<em>-i\u00a0<\/em>como sigue:<\/p>\n<pre>$ grep -i Calzado telefonos.txt telef-may.txt\r\ntelefonos.txt:Carlos Calzado 5550178\r\ntelef-may.txt:CARLOS CALZADO 5550178<\/pre>\n<p>A veces puede interesarnos simplemente saber en cu\u00e1ntas l\u00edneas de un fichero se encuentra la cadena. Para ello podemos usar la opci\u00f3n<em>\u00a0-c<\/em>\u00a0combinada con la anterior:<\/p>\n<pre>$ grep -ic Luis telefonos.txt telef-may.txt\r\ntelefonos.txt:2\r\ntelef-may.txt:2<\/pre>\n<p>Asimismo podemos tambi\u00e9n buscar l\u00edneas que no contengan una cadena. Siguiendo el ejemplo anterior, podemos buscar las l\u00edneas que no contienen &#8216;Luis&#8217; usando la opci\u00f3n\u00a0<em>-v<\/em>:<\/p>\n<pre>$ grep -iv Luis telef.may.txt\r\nMATEO GUERRICER 5559082\r\nGEMA PELLON 5558727\r\nCARLOS CALZADO 5550178<\/pre>\n<h3>Entubando greps<\/h3>\n<p>La utilidad del comando <em>grep<\/em> se muestra especialmente cuando se combina con otros comandos. Como hemos visto con anterioridad una forma de hacerlo es usando &#8216;tuber\u00edas&#8217;.\u00a0 Para ello hay que recordar los conceptos de entrada y salida est\u00e1ndar que vimos y considerar que la salida de un comando puede verse como un fichero.<\/p>\n<p>Por ejemplo, si listamos utilizando la opci\u00f3n\u00a0<em>-l<\/em>\u00a0los ficheros del directorio\u00a0<em>\/var\/log\/<\/em>\u00a0que guarda registros de actividad del sistema obtendremos una salida como la siguiente:<\/p>\n<pre>$ ls -l \/var\/log\r\ntotal 5176\r\ndrwxr-x--- 2 root root\u00a0\u00a0\u00a0 4096 Feb 18 17:16 audit\r\n-rw------- 1 root root\u00a0\u00a0\u00a0\u00a0 972 Mar 26\u00a0 2012 boot.log\r\n-rw------- 1 root utmp 2198784 Feb 22 06:12 btmp\r\n-rw------- 1 root utmp\u00a0\u00a0\u00a0 2688 Apr 18\u00a0 2012 btmp-20130208\r\n...<\/pre>\n<p>Supongamos que nos interesan s\u00f3lo los ficheros normales (no directorios) y del grupo &#8216;utmp&#8217;. Si vemos esta salida como un fichero, la soluci\u00f3n podr\u00eda ser utilizar el comando grep especificando que busque la cadena &#8216;utmp&#8217; y que compruebe que no hay una &#8216;d&#8217; al principio de la l\u00ednea.<\/p>\n<p>Comenzando por la primera condici\u00f3n, escribiremos lo siguiente:<\/p>\n<pre>$ ls -l \/var\/log | grep utmp<\/pre>\n<p>El resultado es el conjunto de l\u00edneas del listado que contienen &#8216;utmp&#8217;. Utilizando el s\u00edmbolo &#8216;|&#8217;, como hab\u00edamos visto, redireccionamos la salida del primer comando al segundo. Ahora podemos a\u00f1adir otro comando <em>grep<\/em> para especificar la segunda condici\u00f3n:<\/p>\n<pre>$ ls -l \/var\/log | grep utmp| grep -v ^d<\/pre>\n<p>El s\u00edmbolo &#8216;^&#8217; antes de la cadena a buscar indica que debe estar situada al principio de la l\u00ednea, que es exactamente lo que nos interesa. Como resultado tenemos el listado resultante del encadenamiento anterior, pero sin directorios.<\/p>\n<p>Finalmente, podemos ilustrar la utilidad de la redirecci\u00f3n para resultados demasiado largos para ver en pantalla o que deseamos conservar:<\/p>\n<pre>$ ls -l \/var\/log | grep utmp| grep -v ^d &gt; lista-adm.txt<\/pre>\n<p style=\"padding-left: 30px;\">Ten en cuenta que no se especifica ninguna opci\u00f3n para la posici\u00f3n de la cadena &#8216;utmp&#8217;, por lo que <em>grep<\/em> puede devolver no s\u00f3lo los ficheros de dicho grupo, sino cualquier l\u00ednea del listado que contenga el texto.<\/p>\n<p style=\"padding-left: 30px;\">\nPrueba a combinar el comando <em>find<\/em> y el comando <em>grep<\/em> para buscar cadenas de texto dentro de un listado de ficheros que cumplen unos criterios de b\u00fasqueda.<\/p>\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Grep Ya hemos visto como podemos realizar b\u00fasquedas de ficheros con una amplia variedad de opciones. Sin embargo, a menudo es necesario tambi\u00e9n buscar dentro de un fichero (normalmente en ficheros de texto). Para ello podemos utilizar el comando\u00a0grep. Informalmente, podemos ver el uso del comando de la siguiente forma: grep &lt;opciones de b\u00fasqueda&gt; &lt;cadena &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/multimedia.uoc.edu\/blogs\/linux\/busqueda-dentro-de-textos\/\" class=\"more-link\">Seguir leyendo<span class=\"screen-reader-text\"> \u00abB\u00fasqueda dentro de textos\u00bb<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-85","post","type-post","status-publish","format-standard","hentry","category-gnulinux","entry"],"_links":{"self":[{"href":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/wp-json\/wp\/v2\/posts\/85","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/wp-json\/wp\/v2\/comments?post=85"}],"version-history":[{"count":2,"href":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/wp-json\/wp\/v2\/posts\/85\/revisions"}],"predecessor-version":[{"id":87,"href":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/wp-json\/wp\/v2\/posts\/85\/revisions\/87"}],"wp:attachment":[{"href":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/wp-json\/wp\/v2\/media?parent=85"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/wp-json\/wp\/v2\/categories?post=85"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/multimedia.uoc.edu\/blogs\/linux\/wp-json\/wp\/v2\/tags?post=85"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}