miércoles, 8 de junio de 2016

grep

El principal programa que usaremos para trabajar con expresiones regulares es nuestro antiguo colega, grep. El nombre "grep" deriva realmente de la frase "global regular expresión print - búsqueda global e impresión de expresiones regulares (del inglés: globally search a regular expression and print)", luego podemos ver que grep tiene algo que ver con las expresiones regulares. En esencia, grep busca en archivos de texto la coincidencia con una expresión regular especificada e imprime, en la salida estándar, líneas que contengan una coincidencia.

Hasta ahora, hemos usado grep con cadenas concretas, así:

[me@linuxbox ~]$ ls /usr/bin | grep zip

Esto listará todos los archivos en el directorio /usr/bin cuyos nombres contengan la cadena "zip".

El programa grep acepta opciones y argumentos de esta forma:

grep [opciones] regex [archivo...]

donde regex es una expresión regular.

Aquí tenemos una lista de las opciones más comunes usadas en grep:

Tabla 20-1: Opciones de grep
Opción Descripción
-i Ignora las mayúsculas. No distingue entre caracteres mayúscula y minúscula. También puede indicarse como --ignore-case.
-v Coincidencia inversa. Normalmente, grep muestra líneas que contienen un patrón. Esta opción hace que grep muestre todas las líneas que no contengan un patrón. También puede indicarse como --invert-match.
-c Muestra el número de coincidencias (o no-coincidencias si también se especifica la opción -v) en lugar de las propias líneas. También puede indicarse como --count.
-l Muestra el nombre de cada archivo que contenga un patrón en lugar de las propias líneas. También puede indicarse como --files-with-matches.
-L Como la opción -l, pero muestra sólo los nombres de los archivos que no contengan el patrón. También puede indicarse como --files-without-match.
-n Precede cada línea coincidente con el número de la línea dentro del archivo. También puede indicarse como --line-number.
-h Para búsquedas multi-archivo, suprime los nombres de archivo de la salida. También puede indicarse como --no-filename.

Para explorar más a fondo grep, creemos algunos archivos de texto para buscar:

[me@linuxbox ~]$ ls /bin > dirlist-bin.txt
[me@linuxbox ~]$ ls /usr/bin > dirlist-usr-bin.txt
[me@linuxbox ~]$ ls /sbin > dirlist-sbin.txt
[me@linuxbox ~]$ ls /usr/sbin > dirlist-usr-sbin.txt
[me@linuxbox ~]$ ls dirlist*.txt
dirlist-bin.txt dirlist-sbin.txt dirlist-usr-sbin.txt
dirlist-usr-bin.txt

Podemos realizar una búsqueda simple de nuestra lista de archivos así:

[me@linuxbox ~]$ grep bzip dirlist*.txt
dirlist-bin.txt:bzip2
dirlist-bin.txt:bzip2recover

En este ejemplo, grep busca en todos los archivos listados la cadena bzip y encuentra dos coincidencias, ambas en el archivo dirlist-bin.txt. Si sólo estuviéramos interesados en la lista de archivos que contienen las coincidencias, podríamos especificar la opción -l:

[me@linuxbox ~]$ grep -l bzip dirlist*.txt
dirlist-bin.txt

Por el contrario, si sólo quisiéramos ver una lista de los archivos que no contienen una coincidencia, podríamos hacer esto:

[me@linuxbox ~]$ grep -L bzip dirlist*.txt
dirlist-sbin.txt
dirlist-usr-bin.txt
dirlist-usr-sbin.txt

No hay comentarios:

Publicar un comentario