3.2 Lección 2
Certificación: |
Linux Essentials |
---|---|
Versión: |
1.6 |
Tema: |
3 El poder de la línea de comandos |
Objetivo: |
3.2 Buscar y extraer datos de los ficheros |
Lección: |
2 de 2 |
Introducción
En esta lección se tratarán algunas herramientas que se utilizan para manipular texto. Estas herramientas son usadas con frecuencia por administradores de sistemas o programas para monitorear o identificar automáticamente información específica recurrente.
Búsquedas en archivos con grep
La primera herramienta de esta lección es el comando grep
. Es la abreviatura de “global regular expression print” y su principal funcionalidad es buscar patrones específicos en los ficheros. El comando muestra la línea que contiene el patrón destacado en color rojo.
$ grep bash /etc/passwd root:x:0:0:root:/root:/bin/bash user:x:1001:1001:User,,,,:/home/user:/bin/bash
El comando grep
, como la mayoría de los comandos, también puede modificar su comportamiento usando varias opciones. A continuación se muestran las más comunes:
-i
-
la búsqueda no distingue mayúsculas o minúsculas
-r
-
la búsqueda es recursiva (busca en todos los ficheros dentro de un directorio específico y sus subdirectorios)
-c
-
la búsqueda cuenta el número de coincidencias
-v
-
invertir la coincidencia para imprimir líneas que no concuerde con el término de búsqueda
-E
-
activa expresiones regulares extendidas (necesarias para algunos de los meta-caracteres más avanzados como
|
,+
y?
)
Consulte la página de manual para obtener más información sobre este tema.
Expresiones regulares
Otra herramienta muy poderosa y que se utiliza para describir bits de texto dentro de los ficheros, son las llamadas expresiones regulares. Las expresiones regulares son extremadamente útiles en la extracción de datos de ficheros de texto mediante la construcción de patrones. Se utilizan generalmente dentro de scripts o al utilizar lenguajes de alto nivel, como Perl o Python.
Al trabajar con expresiones regulares, es muy importante saber que cada caracter cuenta y el patrón se escribe con el propósito de que coincida con una secuencia específica de caracteres, conocida como cadena. La mayoría de los patrones utilizan los símbolos ASCII normales, como letras, dígitos, puntuación u otros símbolos, pero también se pueden utilizar caracteres Unicode para que coincidan con cualquier otro tipo de texto.
La siguiente lista explica los meta-caracteres de las expresiones regulares que se usan para formar los patrones.
`.
-
Encuentra cualquier caracter individual (exceptuando saltos de línea)
[abcABC]
-
Encuentra cualquiera de los caracteres eliminar entre corchetes
[^abcABC]
-
Encuentra cualquiera de los caracteres que no esté entre corchetes.
[a-z]
-
Encuentra cualquier caracter que esté en el rango
[^a-z]
-
Encuentra cualquier caracter que no esté en el rango
sun|sun|moon
-
Encuentra cualquiera de las cadenas de la lista
^
-
Inicio de una línea
$
-
Fin de línea
Todas las funcionalidades de las expresiones regulares se pueden implementar con grep
. Se puede observar que en el ejemplo anterior, la palabra no está rodeada de comillas dobles. Para evitar que el shell interprete el meta-carácter en sí, se recomienda que el patrón más complejo esté entre comillas dobles (" "). Para fines prácticos, se utilizarán comillas dobles al implementar expresiones regulares, mientras que las otras comillas mantienen su funcionalidad normal, tal como se discutió en lecciones anteriores.
Los siguientes ejemplos enfatizan la funcionalidad de las expresiones regulares. Se necesitarán datos dentro del fichero, por lo tanto, el siguiente conjunto de comandos sólo agrega diferentes cadenas de texto al fichero text.txt
.
$ echo "aaabbb1" > text.txt $ echo "abab2" >> text.txt $ echo "noone2" >> text.txt $ echo "class1" >> text.txt $ echo "alien2" >> text.txt $ cat text.txt aaabbb1 abab2 noone2 class1 alien2
El primer ejemplo es una combinación de búsqueda a través del fichero sin y con expresiones regulares. Para entender completamente las expresiones regulares es muy importante mostrar la diferencia. El primer comando busca la cadena exacta, en cualquier parte de la línea, mientras que el segundo busca conjuntos de caracteres que contengan cualquiera de los caracteres entre corchetes, por lo que los resultados de los comandos son diferentes.
$ grep "ab" text.txt aaabbb1 abab2 $ grep "[ab]" text.txt aaabbb1 abab2 class1 alien2
El segundo grupo de ejemplos muestran el uso de los metacaracteres inici y fin de línea. Es muy importante especificar la necesidad de colocar los 2 caracteres en el lugar correcto de la expresión. Cuando se especifica el comienzo de la línea, el metacaracter debe estar antes de la expresión, mientras que cuando se especifica el final de la línea, el metacaracter debe estar después de la expresión.
$ grep "^a" text.txt aaabbb1 abab2 alien2 $ grep "2$" text.txt abab2 noone2 alien2
Además de los metacaracteres explicados anteriormente, las expresiones regulares también incluyen metacaracteres que permiten la multiplicación del patrón previamente especificado:
*
-
Cero o más del patrón precedente
+
-
Uno o más del patrón precedente
?
-
Cero o uno del patrón precedente
Para los metacaracteres, el siguiente comando busca una cadena que contenga ab
, un solo carácter y uno o más de los caracteres encontrados previamente. El resultado muestra que grep
encontró la cadena aaabbb1
, que coincide con abbb
y abab2
. Dado que el carácter +
es un carácter de expresión regular extendida, necesitamos pasar la opción -E
al comando grep
.
$ grep -E "ab.+" text.txt aaabbb1 abab2
La mayoría de los metacaracteres son muy fáciles de entender, pero pueden volverse complicados cuando se usan por primera vez. Los ejemplos anteriores representan una pequeña parte de la funcionalidad de las expresiones regulares. Intente utilizar todos los metacaracteres de la tabla anterior para entender sus funcionalidades.
Ejercicios guiados
Usando grep
y el fichero /usr/share/hunspell/en_US.dic
, busque las líneas que coincidan con los siguientes criterios:
-
Todas las líneas que contengan la palabra
cat
en cualquier parte de la línea -
Todas las líneas que no contengan ninguno de los siguientes caracteres:
sawgtfixkgts
. -
Todas las líneas que comiencen con 3 letras cualquieras y la palabra
dig
. -
Todas las líneas que terminen al menos en una
e
. -
Todas las líneas que contengan una de las siguientes palabras:
org
,kay
otuna
. -
Cantidad de líneas que comiencen con una o ninguna
c
seguida de la cadenaati
.
Ejercicios exploratorios
-
Construya una expresión regular que encuentre las palabras que coincidan con las de la línea “Include” y que no coincidan con las de la línea “Exclude”:
-
Include:
pot
,spot
,apot
Exclude:
potic
,spots
,potatoe
-
Include:
arp99
,apple
,zipper
Exclude:
zoo
,arive
,attack
-
Include:
arcane
,capper
,zoology
Exclude:
air
,coper
,zoloc
-
Include:
0th/pt
,3th/tc
,9th/pt
Exclude:
0/nm
,3/nm
,9/nm
-
Include:
Hawaii
,Dario
,Ramiro
Exclude:
hawaii
,Ian
,Alice
-
-
¿Qué otro comando puede utilizarse para hacer búsqueas en ficheros? ¿Qué otras funcionalidades incluye?
-
Utilizando lo aprendido en lecciones anteriores, utilice uno de los ejemplos e intente buscar un patrón específico dentro de la salida del comando con la ayuda de
grep
.
Resumen
En esta lección, usted aprendió:
-
Metacaracteres de expresiones regulares
-
¿Cómo crear patrones utilizando expresiones regulares?
-
¿Cómo hacer búsquedas en ficheros?
Comandos utilizados en los ejercicios:
grep
-
Busca caracteres o cadenas dentro de un fichero
Respuestas a los ejercicios guiados
Usando grep
y el fichero /usr/share/hunspell/en_US.dic
, busque las líneas que coincidan con los siguientes criterios:
-
Todas las líneas que contengan la palabra
cat
en cualquier parte de la línea$ grep "cat" /usr/share/hunspell/en_US.dic Alcatraz/M Decatur/M Hecate/M ...
-
Todas las líneas que no contengan ninguno de los siguientes caracteres:
sawgtfixkgts
.$ grep -v "[sawgtfixk]" /usr/share/hunspell/en_US.dic 49269 0/nm 1/n1 2/nm 2nd/p 3/nm 3rd/p 4/nm 5/nm 6/nm 7/nm 8/nm ...
-
Todas las líneas que comiencen con 3 letras cualquieras y la palabra
dig
.$ grep "^...dig" /usr/share/hunspell/en_US.dic cardigan/SM condign predigest/GDS ...
-
Todas las líneas que terminen al menos en una
e
.$ grep -E "e+$" /usr/share/hunspell/en_US.dic Anglicize Anglophobe Anthropocene ...
-
Todas las líneas que contengan una de las siguientes palabras:
org
,kay
otuna
.$ grep -E "org|kay|tuna" /usr/share/hunspell/en_US.dic Borg/SM George/MS Tokay/M fortunate/UY ...
-
Cantidad de líneas que comiencen con una o ninguna
c
seguida de la cadenaati
.$ grep -cE "^c?ati" /usr/share/hunspell/en_US.dic 3
Respuestas a los ejercicios exploratorios
-
Construya una expresión regular que encuentre las palabras que coincidan con las de la línea “Include” y que no coincidan con las de la línea “Exclude”:
-
Include:
pot
,spot
,apot
Exclude:
potic
,spots
,potatoe
Respuesta:
pot$
-
Include:
arp99
,apple
,zipper
Exclude:
zoo
,arive
,attack
Respuesta:
p+
-
Include:
arcane
,capper
,zoology
Exclude:
air
,coper
,zoloc
Respuesta:
arc|cap|zoo
-
Include:
0th/pt
,3th/tc
,9th/pt
Exclude:
0/nm
,3/nm
,9/nm
Respuesta:
[0-9]th.+
-
Include:
Hawaii
,Dario
,Ramiro
Exclude:
hawaii
,Ian
,Alice
Respuesta:
^[A-Z]a.*i+
-
-
¿Qué otro comando puede utilizarse para hacer búsqueas en ficheros? ¿Qué otras funcionalidades incluye?
El comando
sed
puede buscar y reemplazar caracteres o conjuntos de caracteres dentro de un fichero. -
Pensando en la lección anterior, use uno de los ejemplos e intente buscar un patrón específico dentro de la salida del comando, con la ayuda de
grep
.Tomé una de las respuestas de los Ejercicios exploratorios y busqué la línea que ha leído, escrito y ejecutado como permisos de grupo. Su respuesta puede ser diferente, dependiendo del comando que eligió y el patrón que creó.
$ cat contents.txt | tr -s " " | grep "^....rwx"
Este ejercicio es para mostrarle que
grep
también puede recibir información de diferentes comandos y puede ayudarlo a filtrar la información generada.