The Inside Out


Este sitio La web

¿Sufriste un ataque de generosidad y quieres regalarme algo? ¡Gracias! Fíjate en mi lista de deseos en Amazon.

Hai avuto un attacco di generosità e vuoi regalarmi qualcosa? Grazie! Controlla nella mia lista dei desideri su Amazon.

Búsqueda de archivos y texto

Uno de los pasos importantes en la configuración de un sistema es la búsqueda de los archivos a configurar. Aunque la interfaz de búsqueda humana (preguntarle a alguien) suele ser suficiente; en este tutorial veremos la manera de buscar archivos o cadenas de texto ("texto" siendo cualquier cosa: números, etc.) dentro de ellos. Usaremos 2 comandos: find y grep.

Nuevamente, al decir "archivos" hablamos de archivos, directorios, dispositivos. Todo en Unix es un archivo. Es cierto, no se pueden ver algunos de esos archivos como a todos los otros. Pero sí puede buscárselos.

Además, una vez que encontramos los archivos, podemos trabajar con ellos: modificarlos, guardar la lista, renombrar... Muchas cosas. Es la ventaja de usar sistemas con interfazs de usuario tan potentes. Pero pasemos a los comandos.

find

Find busca archivos en un directorio y sus subdirectorios. Si no se especifica uno en particular, busca desde el directorio actual. El uso de find es:

find archivo expresión

Por ejemplo, el comando que sigue busca y muestra los nombres de todos los archivos en el árbol de directorios /usr/src hasta los situados tres directorios debajo de /usr/src (si no comprende esto lea la ayuda de find, especialmente la opción -maxdepth), que terminen con ".rpm" y cuyos tamaños sean mayores a 100 kbytes. Las expresiones pueden incluir opciones generales, comparaciones (para distinguir entre archivos), y acciones que afectan al resultado de la búsqueda. Por ejemplo, en el comando abajo, -maxdepth es una opción, -name y -size son comparaciones; -print (que no es necesaria en este caso) es una acción:

find /usr/src -maxdepth 3 -name '*.rpm' -size +100k -print

El resultado del comando en nuestro caso es:

 find /usr/src -maxdepth 3 -name '*.rpm' -size +100k -print
/usr/src/RPM/SRPMS/centericq-4.9.7-1.src.rpm
/usr/src/RPM/SRPMS/sylpheed-0.9.7-1.src.rpm

Por lo dicho, find es el comando a usar si está buscando archivos. Un uso simple de find: buscar un archivo determinado en un directorio y sus subdirectorios:

[rogelio@Edhellond rogelio]$ find -name rime*
./docs/rime10.txt
[rogelio@Edhellond rogelio]$

Como ve, encontramos el archivo "rime.txt" dentro del subdirectorio docs. Por si le interesa, es el libro "La balada del viejo marinero", un poema de S.T.Coleridge. Puede encontrarlo en el sitio del proyecto Gutenberg, junto con cientos de otros clásicos, totalmente gratis. Seguiremos usando el archivo para demostrarle el uso de grep.

grep

Este comando busca texto que coincida con el patrón pedido. Sus posibles opciones son muchísimas, pero las esenciales puede que sean éstas que veremos:

  • -número muestra número líneas de texto antes y después de las coincidencias. Variantes: -A número (After, después) y -B número (Before, antes)
  • -f archivo se ejecuta sobre ese archivo
  • -i no diferencia entre mayúsculas o minúsculas

Usemos grep entonces. Para empezar, un ejemplo fácil:

[rogelio@Edhellond rogelio]$ grep -n -e Mariner docs/rime10.txt
1:The Project Gutenberg Etext of The Rime of the Ancient Mariner
20:The Rime of the Ancient Mariner
29:**The Rime of the Ancient Mariner by Samuel Taylor Coleridge**
267:It is an ancient Mariner,
285:The Mariner hath his will.
290:The bright-eyed Mariner.
315:The bright-eyed Mariner.
364:"God save thee, ancient Mariner!
556:"I fear thee, ancient Mariner!
709:"I fear thee, ancient Mariner!"
829:When the Mariner's trance is abated.
1067:The Mariner, whose eye is bright,
[rogelio@Edhellond rogelio]$

busca todas las líneas que contengan la cadena de texto "Mariner" en el archivo rime10.txt, y les agrega el número de línea. Si hubiésemos usado la opción -i la lista sería más larga. (encontraría, por ejemplo, "MARINER" y "mariner", e incluso "mariners". Si quisiéramos encontrar una palabra exacta, usaríamos la opción -w:

[rogelio@Edhellond rogelio]$ grep -w "Sun's" docs/rime10.txt -n
520:The Sun's rim dips; the stars rush out:
[rogelio@Edhellond rogelio]$

Note que, si no hubiésemos usado las comillas dobles alrededor de "Sun's", el resultado no habría sido el buscado.

Ahondando un poco en el uso de grep, veamos algo más sobre expresiones regulares. Estas bestias son herramientas poderosísimas para usar grep (y también en edición avanzada de textos). Básicamente, una expresión regular es un patrón de búsqueda más o menos complejo. Por ejemplo: grep [1-9] usa una expresión regular, que en este caso busca cualquier número entre 1 y 9. Si agrego un '^' al principio de la expresión, se buscan todos los carácteres salvo esos. Hay abreviaturas como [:alnum:], que busca cualquier carácter alfanumérico. El comando sería grep [[:alnum:]], con dobles corchetes. Esto es una característica de las expresiones regulares, llamada clase. Una clase define un grupo de caracteres, en este caso los alfanuméricos.

[rogelio@Edhellond rogelio]$ grep [3-6] docs/rime10.txt -n
23:July, 1994  [Etext #151]
36:people, on about 250 million computers currently in existence: 
37:then we will have given about 15.1 billion Etexts away when the
66:Files by the December 31, 2001.  [10,000 x 100,000,000=Trillion]
82:Champaign, IL 61825
101:or cd etext93 [for new books]  [now also in cd etext/etext93]
131:sending a request within 30 days of receiving it to the person
195:or addition to the etext, or [3] any Defect.
234:[3]  Pay a trademark license fee to the Project of 20% of the
239:     Benedictine College" within the 60 days following each
251:Internet (72600.2026@compuserve.com); TEL: (212-254-5093)
252:*END*THE SMALL PRINT! FOR PUBLIC DOMAIN ETEXTS*Ver.04.29.93*END*
[rogelio@Edhellond rogelio]$

grep también puede usarse para buscar archivos, usando las opciones -l y -r:

grep -l 'main' *.c

busca todos los archivos que contengan la cadena main y terminen en .c;

grep -r 'hola' /home

busca recursivamente (bajando por los subdirectorios) desde /home, la cadena hola. Para estos usos conviene en realidad usar una combinación de grep y find.

Cuándo usar uno u otro

Normalmente, find se usa para encontrar nombres de archivo buscando en los directorios. grep es para buscar cadenas de texto en archivos o en la consola (puede hacerse un grep de lo que un comando devuelve como resultados. Por ejemplo, podría hacerse grep del resultado del comando ls. Ahora, como un directorio en Linux también es técnicamente un archivo, es posible hacer muchas cosas que en principio a uno no se le ocurren. El uso depende entonces de lo que quiera y sepa hacer. De todos modos, info comando o man comando le darán la ayuda que está buscando. Un último truco: info ``Finding Files'' (note el uso de acentos graves al principio de la cadena y apóstrofes al final).

Combinación de comandos

Supongamos que queremos archivar una búsqueda, o verla más cómodamente (el desplazamiento por la pantalla de terminal no es eterno). Tenemos dos opciones: una es correr

find archivo buscado > archivo

lo que guarda en el archivo el resultado de la búsqueda.

La segunda opción es combinar un comando antes de find:

less `find /usr/include -name '*.h' | xargs grep -l mode_t`

es una combinación algo extensa: hace que combinemos (con el comando xargs) los comandos grep (de búsqueda de cadenas en archivos) con find (de búsqueda de archivos); luego pasamos el resultado al comando less, que los presenta en pantalla. Si en lugar de éste usamos vi o algún otro editor de texto, podremos editar la búsqueda inmediatamente para darle el formato que deseemos.

Encontrará, leyendo a lo largo del manual de find, que se usan mucho los comandos find y xargs combinados, separados por un |. Esto fue explicado en el tutorial intermedio de Bash, en el tema de pipes. Por ahora, sepan que el símbolo | representa una tubería o pipe, y que ésta es una herramienta que toma el resultado de una acción y lo lleva a otro comando. Especialmente, veremos que find se usa en scripts de backup o de limpieza: buscar archivos a almacenar o borrar. Con info find encontrarán muchos ejemplos de esto.

Ya estamos listos. Es hora de ver el uso de un editor de textos profesional, o de ver cómo crear y usar scripts si prefiere.

Contactarme - Contattarmi

Ningún dato es necesario, salvo antispam y el texto del mensaje.

Nessun dato è necessario, aparte antispam e il testo del messaggio.

Si tienes problemas con el formulario, escríbeme a la dirección de correo en la imagen:

Se hai problemi usando il form, scrivi all'email nell'immagine:

mailto image

Nombre / Nome
Email
Subject
Anti Spam: 2 + 2 =
Texto / Testo