En este momento estás viendo Shell-4  Expresiones regulares y filtros

Shell-4 Expresiones regulares y filtros

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
^expCualquier 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.

abces una expresión regular que consta de tres caracteres.
a.crepresenta cualquier subcadena de tres caracteres que empiece por a y termine por b (como asb ó axb pero no la cadena abbc)
[abc]bdenota 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

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:

-vmuestra 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,6columnas 2,4 y 6
1-4,6columnas de 1 a 4 y la 6
-4,6columnas 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.

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, al pie del post tienes un formulario para hacerlo.

Y si quieres contactar conmigo por cualquier otro asunto relacionado con el sitio, o te quieres suscribir para recibir un correo-e periódicamente con las últimas publicaciones, en la pagina de contacto, tienes otro formulario.

Deja una respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.