Expresiones regulares y filtros en Linux
Sumario
- Caracteres, cadenas y operadores
- La orden grep
- La orden tr
- La orden sed
- La orden cut
Caracteres, cadenas y operadores
Con los Sistemas Operativos UNIX podemos definir cadenas múltiples mediante expresiones regulares.
Una expresión regular está formada con secuencias de expresiones constituidas por caracteres simples que se combinan con operadores.
Estos operadores son:
. | El punto representa cualquier carácter simple (caracter) |
[ ] | Los corchetes denotan un conjunto de caracteres (cadena) |
[^ ] | Representa cualquier carácter no contenido en los corchetes |
[ – ] | Los corchetes con guión delimitan rangos |
* | Denota cero o más ocurrencias de la expresión precedente |
^exp | Cualquier cadena que se inicie con la expresión regular exp |
exp$ | Cualquier cadena que termine con la expresión regular exp |
En la siguiente tabla vemos unos ejemplos de cadenas con operadores.
abc | es una expresión regular que consta de tres caracteres. |
a.c | representa cualquier subcadena de tres caracteres que empiece por a y termine por b (como asb ó axb pero no la cadena abbc) |
[abc]b | denota cualquier subcadena de dos caracteres que empiece por a, b ó c y termine con una b. |
[A-Za-z] | representa a cualquier carácter alfabético simple, ya sea en mayúsculas o minúsculas. |
[0-9][0-9]* | es una expresión regular que representa una secuencia de dígitos de cualquier longitud. |
[^0-9] | representa a cualquier carácter que no sea un dígito. |
Para que las expresiones regulares tengan como referencia el código ASCII, tenemos asignar a la variable LANG el valor C.
$LANG=C
La orden grep
La orden grep es un potente filtro que nos permite buscar cadenas de caracteres en ficheros de nuestro sistema. Utiliza las expresiones regulares para buscar cadenas coincidentes. La orden grep toma la cadena establecida en la expresión regular, busca el mismo patrón en el fichero que le indicamos y muestra, en la salida estandar, las lineas del fichero coincidentes.
La sintaxis es como sigue:
grep patron_que_buscamos fichero_en_el_que_buscamos
Ejemplos
El primer argumento de la orden grep (patron_que_buscamos), puede ser un caracter, una cadena de caracteres o una expresión regular. Veamos:
grep ^[a-zA-Z][0-9][0-9]* fichero
Esta orden buscará en el fichero «fichero» las lineas que contienen una cadena de caracteres coincidente con: empieza con una letra minúscula o mayúscula, seguida de cualquier número. Un ejemplo:
Tenemos el fichero «palabras», con el siguiente contenido:
moto coche camion bote yate barco verde azul claro nuboso lluvia final 987654321 javier
Si queremos buscar una linea que empiece por un número, ejecutaremos:
grep ^[0-9][0-9]* palabras

También podemos utilizar este comando para buscar en varios ficheros. Si, por ejemplo, buscamos una información y tenemos dudas de en que fichero lo guardamos, nos permite incluir varios ficheros para la búsqueda.
grep "Lo que busco" ficheroA ficheroB ficheroC
Buscará la linea o lineas de los tres ficheros que contengan la cadena «Lo que busco». Deberemos entrecomillarla para que lo reconozca como una cadena y no como tres argumentos. Si este patrón aparece en varios ficheros, el sistema nos indicará en cuales de ellos se encuentran las lineas coincidentes.
Si son muchos ficheros en los que buscar y están todos en el mismo directorio, lo podríamos hacer con:
grep "Lo que busco" *

Pero también tenemos opciones para el comando, que se indican inmediatamente después de la orden. Las más importante son:
-v | muestra las líneas que no coinciden con el patrón especificado |
-c | (count) cuenta las líneas coincidentes |
-n | (number) añade el número de línea en el fichero a la salida de líneas coincidentes |
-i | (ignore) ignora las distinciones entre mayúsculas y minúsculas en las coincidencias |
Por ejemplo:
grep -v "^[0-9]*$" fichero
Buscará cualquier linea que no empiece por un número.

La orden tr
La sintaxis de la orden es la siguiente:
tr [opcion] cadena1 cadena2
La orden tr sirve para cambiar una cadena de caracteres por otra. Es un filtro que se suele usar tras una tubería, pero podemos utilizarlo como un comando redirigiendo la entrada estandar a un archivo con el caracter «<«. Veamos las dos opciones, que son equivalentes:
cat /etc/passwd | tr ":" "#" o tr ":" "#" < /etc/passwd

Nos ofrecería, en los dos casos, por la salida estandar, el contenido del fichero passwd cambiando el separador de campos «:» por «#».
Si utilizamos la orden sin opciones, simplemente sustituye un conjunto de caracteres por otro.
echo "lo que busco" | tr "lqb" "LQB"

Con la opción -d (delete) elimina, de la salida estandar, los caracteres que especifiquemos.
echo "Ande o no ande, siempre burro grande." | tr -d ",."

Como veremos, lo podemos utilizar tantas veces como lo necesitemos…
Con la opción -s (substitute) sustituye, en la salida estandar, todos los caracteres que indiquemos por otro especificado.
echo "Ande o no ande siempre burro grande." | tr -s " " "_"

La orden sed
La orden sed es otro filtro que nos permite modificar el contenido de los ficheros. La sintaxis es:
sed "s/cadena1/cadena2/" fichero
Leerá el contenido de «fichero» y sustituirá, en la salida estandar, la primera ocurrencia que encuentre de «cadena1» por «cadena2». El resto del contenido se escribirá sin modificaciones. Veamos un ejemplo:
echo "Mi coche es un Renault 5 de color rojo" | sed "s/rojo/verde/"

Con esta orden, también podemos eliminar la primera coincidencia con una cadena de caracteres.
echo "Mi coche es un Renault 5 de color rojo" | sed "s/5//"

Pero si necesitamos borrar todas las ocurrencias que encuentre en el fichero, lo haremos así:
echo "esto es esperpentico" | sed "s/e//g"

Podemos utilizar una expresión regular como cadena de coincidencia. En este caso sustituimos Renault5 por Seat600, en la primera ocurrencia que encuentre.
Creamos el fichero «coche» con el siguiente contenido, «Mi coche es un Renault5 de color rojo»
echo "Mi coche es un Renault5 de color rojo" > coche
Y ejecutamos la orden:
sed "s/Renault [0-9]*/Seat600/" coche

Si lo queremos cambiar en todas las ocurrencias lo ejecutamos así:
sed "s/Renault [0-9]*/Seat600/g" coche
También podemos indicar los números de linea del fichero en los que queremos hacer cambios.
sed "1,12,27 s/rojo/verde/" coche
Sustituirá la primera ocurrencia de la cadena «rojo» por «verde» solo en las lineas del fichero 1, 12 y 27.
Para hacer las sustituciones de manera global afectando a todas las ocurrencias de las lineas indicadas, añadimos el caracter «g».
sed "1,12,27 s/rojo/verde/g" coche
La orden cut
La orden cut se utiliza para extraer, por la salida estandar, subcadenas de caracteres del contenido de un fichero. Tiene varias opciones:
-c (column) | extrae los caracteres contenidos en las columnas que se indican |
-f (field) | extrae los campos delimitados por el caracter especificado con la opción d (delimiter) |
-b (bytes) | extrae los bytes contenidos en las columnas que se indican |
La sintaxis de las dos opciones principales es:
cut -c columnas fichero1 fichero2 cut -f campos -d caracter_delimitador -s fichero1 fichero2
Columnas son un listado de números enteros, separados por «,» que determina las columnas a extraer. Podemos utilizar rangos con el caracter «-«. Por ejemplo:
2,4,6 | columnas 2,4 y 6 |
1-4,6 | columnas de 1 a 4 y la 6 |
-4,6 | columnas desde la 1 a la 4 y desde la 6 a la última |
Campos son un listado y/o rango de números enteros, delimitados con un caracter establecido con la opcion d, que determina los campos a extraer.
Opciones del filtro cut
Veamos todas estas opciones.
-c .- Su función es extraer columnas. Por ejemplo:
cut -c 1-12
Obtendrá las doce primeras columnas, es decir los primeros doce caracteres de todas las lineas.
-f .-Su función es extraer campos. Son porciones de texto, enteros o campos alfanuméricos, delimitados con la opcion d, como hemos visto.
-d caracter .-Con la opcion -f del comando, su función es establecer el delimitador de los campos a seleccionar. Por defecto el delimitador es el tabulador y si se establece otro delimitador deberá estar entrecomillado.
-s .-Cuando se usa la opción -f, suprime las líneas que no poseen un carácter delimitador de campo.
Veamos unos ejemplos:
Tenemos el fichero llamado «palabras», que creamos antes, con el siguiente contenido,
moto coche camion bote yate barco verde azul claro nuboso lluvia final 987654321 javier
con la orden,
cut -f 1,3 -d" " palabras
Obtendremos la siguiente salida
moto camion bote barco verde claro lluvia final 987654321 javier
Con la opción -c,
cut -c 1-3 palabras
La salida será:
mot bot ver cla fin 987 jav

Y finalmente veamos la opción -s. Si ejecutamos:
cut -f 1,3 -d " " -s palabras
La salida es:
moto camion bote barco verde claro lluvia

Como vemos en la captura de pantalla, corta los campos 1 y 3, pero con «-s» solo muestra aquellas lineas del fichero, que contienen el caracter delimitador » «, que hemos determinado. Las lineas que contienen una sola cadena o campo, y por tanto no tienen delimitador, no se muestran.
Si tienes algún comentario que hacer sobre este artículo, al pie del post tienes un formulario para hacerlo.
Si quieres contactar conmigo por cualquier otro asunto relacionado con el sitio, en la página de contacto, tienes un formulario más adecuado.
Y para suscribirte y recibir las novedades publicadas, tienes un enlace en el pie de la página o desde aquí mismo.