Existen, además de los filtros que ya vimos, otros dos filtros muy
poderosos, llamados sed
y awk
. Tienen una sintaxis tan avanzada
que se los considera pequeños lenguajes de programación. En este curso no
los vamos a estudiar.
Sin embargo, gran parte de la potencia de estos es su manejo de expresiones
regulares que es el mismo que el de grep
, que veremos a continuación.
Como ya vimos, podemos hacer grep patrón archivos
y veremos las
líneas que concuerdan con el patrón en esos archivos,
La gran fortaleza de grep
se encuentra en la sintaxis
del patrón. Hasta ahora, el patrón que ingresábamos era simplemente una
palabra, y eso le indicaba a grep
que debía encontrar las líneas que
contuvieran esa palabra.
Sin embargo, en ese patrón podemos incluir lo que se llama una expresión regular. Las expresiones regulares son cadenas de caracteres que permiten transmitirle a los filtros una búsqueda mucho más avanzada. Tenemos la posibilidad, por ejemplo, de indicar si queremos que algo esté al principio o al final de un archivo, si queremos que esté repetido una determinada cantidad de veces, etc.
^
indica comienzo de línea, es decir que el patrón que
esté a continuación debe estar al principio de la línea.
Por ejemplo, podemos querer ver todas las líneas del comando who
que
comienzan con un nombre de usuario en particular. Esto lo haríamos
ejecutando: who | grep ^usuario
.
Por ejemplo, si hacemos ls -l | grep '^.......rw'
veremos los archivos
que tengan permisos de lectura y escritura para el resto mundo.
[...]
muy parecido al del shell.
.*
obtendremos el mismo comportamiento que el del
*
de shell.
Por ejemplo,
ls -l | grep '^.*rw'
puede mostrarnos los archivos que tengan algún
permiso de escritura y lectura, o bien algún archivo que contenga las letras
rw en su nombre.
Un problema común es que muchos de los caracteres que grep
usa como caraceres
especiales son los mismos que usa el shell como metacaracteres y esto puede
llegar a confundirnos mucho, por lo que usamos los patrones entre comillas
simples ('...') para evitar problemas de intrepretación del shell. Pero
también podemos querer que el grep no interprete determinado caracter en
ese caso usamos \
.
En realidad, grep es el primero de una familia de comandos, egrep tiene un set de expresiones regulares más completo, mientras fgrep esta optimizado para manejo de archivos grandes, pero solo busca literales.
En la actualidad la version GNU de estos comandos resume los tres dentro de grep con las opciones -E y -F, pero existen más, como el ngrep (network grep), grepmail, etc.
Se listan a continuación las expresiones de grep y egrep,
por orden de precedencia, con una explicación somera de su significado.
Expresión | Significado |
c | cualquier caracter no especial, concuerda a si mismo |
![]() |
cancela significado especial de c |
^ |
inicio de línea |
$ | fin de línea |
. | cualquier caracter individual |
[...] |
cualquiera de los caracteres en ...; incluye rangos de tipo a-z |
[^...] |
cualquiera de los caracteres que no esté en ...; también se incluyen los rangos a-z |
r* | cero o más ocurrencias de r |
r+ | una o más ocurrencias de r (egrep) |
r? | cero o una ocurrencia de r (egrep) |
r1|r2 |
expresión r1 o expresión r2 (egrep) |
![]() ![]() |
agrupar expresión regular r (grep) |
(r) | agrupar expresión regular r (egrep) |
![]() |
lo que concordó con la num-ésima expresión regular agrupada |
Ante la pregunta posible, que puede surgir mirando esta tabla, de cuál es
el significado de (r)
cuando se utiliza grep, la respuesta es que
simplemente concuerda con los paréntesis, como cualquier caracter sin
significado especial
Utilizando el diccionario que se encuentra en el directorio /usr/share/dict, encontrar las expresiones regulares que concuerdan con los siguientes tipos de palabras.
grep
encadenados).