Menú
Gratis
Registro
hogar  /  Instalación y configuración/ Ejemplos de expresiones regulares en linux. Cinco ejemplos del uso de grep

Ejemplos de expresiones regulares de Linux. Cinco ejemplos del uso de grep

Uno de los comandos más útiles y versátiles en la terminal de Linux es el comando "grep". Grep es un acrónimo que significa "impresión de expresión regular global" (es decir, "buscar en todas partes líneas de expresión regular coincidentes y generarlas"). Esto significa que grep se puede usar para ver si la entrada coincide con los patrones dados.

Este programa aparentemente trivial es muy poderoso cuando se usa correctamente. Su capacidad para clasificar entradas en función de reglas complejas lo convierte en un archivador popular en muchas cadenas de comandos.

Este tutorial analiza algunas de las características del comando grep y luego pasa al uso de expresiones regulares. Todas las técnicas descritas en esta guía se pueden aplicar a la gestión de un servidor virtual.

Conceptos básicos de uso

En su forma más simple, grep se usa para encontrar coincidencias para patrones de letras en un archivo de texto. Esto significa que si el comando grep recibe una palabra de búsqueda, imprimirá cada línea del archivo que contiene esa palabra.

Como ejemplo, puede usar grep para buscar líneas que contengan la palabra "GNU" en la versión 3 de la Licencia pública general de GNU en un sistema Ubuntu.

cd /usr/share/licencias-comunes
grep "GNU" GPL-3
LICENCIA PÚBLICA GENERAL GNU





13. Uso con la Licencia Pública General GNU Affero.
bajo la versión 3 de GNU Affero General Public License en un único
...
...

El primer argumento, "GNU", es la plantilla a buscar y el segundo argumento, "GPL-3", es el archivo de entrada a buscar.

Como resultado, se mostrarán todas las líneas que contengan el patrón de texto. En algunas distribuciones de Linux, el patrón buscado se resaltará en las líneas de salida.

Opciones generales

Por defecto, grep simplemente busca patrones fuertemente especificados en el archivo de entrada e imprime las líneas que encuentra. Sin embargo, el comportamiento de grep se puede cambiar agregando algunas banderas adicionales.

Si desea ignorar las mayúsculas y minúsculas del parámetro de búsqueda y buscar variaciones del patrón en mayúsculas y minúsculas, puede utilizar las utilidades "-i" o "--ignore-case".

Por ejemplo, puede usar grep para buscar en el mismo archivo la palabra "licencia" en mayúsculas, minúsculas o mixtas.

grep -i "licencia" GPL-3
LICENCIA PÚBLICA GENERAL GNU
de este documento de licencia, pero no se permite cambiarlo.
La Licencia Pública General GNU es una licencia gratuita con copyleft para
Las licencias para la mayoría del software y otros trabajos prácticos están diseñadas
la Licencia Pública General GNU está destinada a garantizar su libertad para
Licencia Pública General GNU para la mayor parte de nuestro software; también se aplica a


"Esta Licencia" se refiere a la versión 3 de la Licencia Pública General GNU.
"El Programa" se refiere a cualquier trabajo protegido por derechos de autor bajo esta
...
...

Como puede ver, la salida contiene "LICENCIA", "licencia" y "Licencia". Si hubiera una instancia de "LiCeNsE" en el archivo, también se generaría.
Si desea encontrar todas las líneas que no contienen el patrón especificado, puede usar las banderas "-v" o "--invert-match".

Como ejemplo, puede utilizar el siguiente comando para buscar en la licencia BSD todas las líneas que no contengan la palabra "the":

grep -v "el"BSD
Reservados todos los derechos.
Redistribución y uso en formato fuente y binario, con o sin
se cumplan:
puede usarse para respaldar o promocionar productos derivados de este software
sin permiso previo por escrito específico.
ESTE SOFTWARE ES PROPORCIONADO POR LOS REGENTES Y CONTRIBUYENTES ``TAL CUAL"" Y
CUALQUIER GARANTÍA EXPLÍCITA O IMPLÍCITA, INCLUYENDO, ENTRE OTRAS, LA
...
...

Como puede ver, las dos últimas líneas se generaron sin contener la palabra "el" porque no se usó el comando "ignorar mayúsculas y minúsculas".

Siempre es útil saber los números de línea donde se encontraron coincidencias. Se pueden encontrar usando las banderas "-n" o "--line-number".

Si aplica este indicador en el ejemplo anterior, se mostrará el siguiente resultado:

grep -vn "el" BSD
2:Todos los derechos reservados.
3:
4: Redistribución y uso en formato fuente y binario, con o sin
6: se cumplen:
13: puede usarse para respaldar o promocionar productos derivados de este software
14: sin autorización previa por escrito.
15:
16: ESTE SOFTWARE ES PROPORCIONADO POR LOS REGENTES Y CONTRIBUYENTES ``TAL CUAL"" Y
17: CUALQUIER GARANTÍA EXPLÍCITA O IMPLÍCITA, INCLUYENDO, ENTRE OTRAS, LA
...
...

Ahora puede consultar el número de línea según sea necesario para realizar cambios en cada línea que no contenga "el".

Expresiones regulares

Como se mencionó en la introducción, grep significa "impresión de expresión regular global". Una expresión regular es una cadena de texto que describe un patrón de búsqueda específico.

Diferentes aplicaciones y lenguajes de programación usan expresiones regulares de formas ligeramente diferentes. Esta guía cubre solo un pequeño subconjunto de cómo se describen los patrones Grep.

coincidencias de letras

Los ejemplos anteriores de búsqueda de las palabras "GNU" y "the" buscaron expresiones regulares muy simples que coincidieran exactamente con la cadena de caracteres "GNU" y "the".

Es más correcto representarlos como coincidencias de cadenas de caracteres que como coincidencias de palabras. A medida que se familiarice con patrones más complejos, esta distinción se volverá más significativa.

Los patrones que coinciden exactamente con los caracteres dados se denominan "alfabéticos" porque coinciden con el patrón letra por letra, carácter por carácter.

Todos los caracteres alfabéticos y numéricos (así como algunos otros caracteres) coinciden literalmente a menos que hayan sido modificados por otros motores de expresión.

Partidos de ancla

Los anclas son caracteres especiales que indican la ubicación en una cadena de una coincidencia deseada.

Por ejemplo, puede especificar que la búsqueda solo busque cadenas que contengan la palabra "GNU" al principio. Para hacer esto, debe usar el ancla "^" antes de la cadena literal.

En este ejemplo, solo se muestran las líneas que contienen la palabra "GNU" al principio.

grep "^GNU" GPL-3
Licencia Pública General GNU para la mayor parte de nuestro software; también se aplica a
Licencia pública general de GNU, puede elegir cualquier versión publicada

De manera similar, el ancla "$" se puede usar después de una cadena literal para indicar que la coincidencia es válida solo si la cadena de caracteres que se busca está al final de la cadena de texto.

La siguiente expresión regular genera solo aquellas líneas que contienen "y" al final:

grep "y $" GPL-3
que no hay garantía para este software gratuito. Para ambos usuarios" y
Los términos y condiciones precisos para la copia, distribución y


la alternativa se permite solo ocasionalmente y sin fines comerciales, y
podrá denegarse la red cuando la propia modificación material y
afecta adversamente el funcionamiento de la red o viola las reglas y
provisionalmente, a menos y hasta que el titular de los derechos de autor explícita y
recibe una licencia de los licenciantes originales, para ejecutar, modificar y
hacer, usar, vender, ofrecer para la venta, importar y ejecutar, modificar y

Coincide con cualquier personaje

El punto (.) se usa en expresiones regulares para indicar que cualquier carácter puede aparecer en la ubicación especificada.

Por ejemplo, si desea encontrar coincidencias que contengan dos caracteres y luego la secuencia "concepto", usaría el siguiente patrón:

grep "..cepto" GPL-3
uso, que es precisamente donde resulta más inaceptable. por lo tanto, nosotros
infracción bajo la ley de derechos de autor aplicable, excepto ejecutarla en un
le dice al usuario que no hay garantía por el trabajo (excepto para el

forma de una licencia escrita por separado, o establecida como excepciones;
Usted no puede propagar o modificar un trabajo amparado excepto como expresamente
9. No se requiere aceptación para tener copias.
...
...

Como puede ver, las palabras "aceptar" y "excepto" se muestran en los resultados, así como variaciones de estas palabras. El patrón también coincidiría con la secuencia "z2cept" si hubiera una en el texto.

Expresiones entre paréntesis

Al colocar un grupo de caracteres entre corchetes (""), puede indicar que cualquiera de los caracteres entre corchetes puede estar en esta posición.

Esto significa que si necesita encontrar cadenas que contengan "demasiado" o "dos", puede especificar brevemente estas variaciones utilizando el siguiente patrón:

grep "a" GPL-3
sus programas también.

Los desarrolladores que usan GNU GPL protegen sus derechos con dos pasos:
una red informática, sin transferencia de una copia, no está transmitiendo.

Fuente correspondiente de un servidor de red sin cargo.
...
...

Como puede ver, ambas variaciones se encontraron en el archivo.

Los caracteres entre corchetes también proporcionan varias características útiles. Puede especificar que el patrón coincida con todo excepto con los caracteres entre paréntesis comenzando la lista de caracteres entre paréntesis con el carácter "^".

En este ejemplo, se utiliza la plantilla ".ode", que no debe coincidir con la secuencia "código".

grep "[^c]odo" GPL-3
1. Código fuente.
modelo, para dar a cualquiera que posea el código objeto (1) un
el único modo significativo de uso del producto.
aviso como este cuando se inicia en un modo interactivo:

Vale la pena señalar que la segunda línea de salida contiene la palabra "código". Esto no es un error regex o grep.

Más bien, esta línea se infirió porque también contiene la secuencia de "modo" de coincidencia de patrones que se encuentra en la palabra "modelo". Es decir, la cadena se emitió porque coincidía con el patrón.

Otra característica útil de los corchetes es la capacidad de especificar un rango de caracteres en lugar de escribir cada carácter por separado.

Esto significa que si desea encontrar todas las líneas que comienzan con una letra mayúscula, puede usar el siguiente patrón:

grep "^" GPL-3
Licencia Pública General GNU para la mayor parte de nuestro software; también se aplica a

licencia. A cada licenciatario se le llama "usted". "Licencias" y


Bibliotecas del sistema, o herramientas de propósito general o gratuitas disponibles en general
fuente.

...
...

Debido a algunos problemas de clasificación inherentes, es mejor utilizar las clases de caracteres estándar POSIX en lugar del rango de caracteres utilizado en el ejemplo anterior para obtener un resultado más preciso.
Hay muchas clases de personajes que no se tratan en esta guía; por ejemplo, para realizar el mismo procedimiento que en el ejemplo anterior, puede usar la clase de carácter "[:superior:]" entre paréntesis.

grep "^[[:superior:]]" GPL-3
Licencia Pública General GNU para la mayor parte de nuestro software; también se aplica a
Los Estados no deberían permitir que las patentes restrinjan el desarrollo y el uso de
licencia. A cada licenciatario se le llama "usted". "Licencias" y
Componente, y (b) sirve solo para permitir el uso del trabajo con ese
Componente Principal, o para implementar una Interfaz Estándar para la cual un
Bibliotecas del sistema, o herramientas de propósito general o gratuitas disponibles en general
fuente.
El Producto de usuario se transfiere al destinatario a perpetuidad o por un
...
...

Repetir patrón (0 o más veces)

Uno de los metacaracteres más utilizados es el carácter "*", que significa "repetir el carácter o expresión anterior 0 o más veces".

Por ejemplo, si desea encontrar todas las líneas con paréntesis de apertura o cierre que contengan solo letras y espacios simples entre ellas, puede usar la siguiente expresión:

grep "(*)" GPL-3

distribución (con o sin modificación), poniendo a disposición del
que la obra en su conjunto, que (a) se incluye en la forma normal de
Componente, y (b) sirve solo para permitir el uso del trabajo con ese
(si lo hay) en el que se ejecuta el trabajo ejecutable, o un compilador utilizado para
(incluido un medio de distribución física), acompañado de la
(incluido un medio de distribución física), acompañado de un
lugar (gratis o por un cargo), y ofrecer un acceso equivalente a la
...
...

Cómo evitar los metacaracteres

A veces, es posible que desee buscar un punto literal o un paréntesis abierto literal. Debido a que estos caracteres tienen un significado específico en las expresiones regulares, debe "escapar" de ellos diciéndole a grep que no use su significado especial en este caso.

Estos caracteres se pueden escapar usando una barra invertida (\) antes de un carácter que normalmente tiene un significado especial.

Por ejemplo, si desea encontrar una cadena que comience con una mayúscula y termine con un punto, puede usar la siguiente expresión. La barra invertida antes del último punto le dice al comando que lo "evite", de modo que el último punto representa un punto literal y no tiene el significado de "ningún carácter":

grep "^.*\.$" GPL-3
fuente.
Licencia haciendo excepciones a una o más de sus condiciones.
La licencia sería abstenerse por completo de transmitir el Programa.
TODO EL MANTENIMIENTO, REPARACIÓN O CORRECCIÓN NECESARIOS.
DICHOS DAÑOS.
También agregue información sobre cómo contactarlo por correo electrónico y en papel.

Expresiones regulares extendidas

El comando grep también se puede usar con el lenguaje de expresión regular extendido usando el indicador "-E" o llamando al comando "egrep" en lugar de "grep".

Estos comandos abren las posibilidades de "expresiones regulares extendidas". Las expresiones regulares extendidas incluyen todos los metacaracteres básicos, así como metacaracteres adicionales para expresar coincidencias más complejas.

Agrupamiento

Una de las características más simples y útiles de las expresiones regulares extendidas es la capacidad de agrupar expresiones y usarlas como un todo.

Los paréntesis se utilizan para agrupar expresiones. Si necesita usar paréntesis fuera de las expresiones regulares extendidas, se pueden "escapar" con una barra invertida

grep "\(agrupación\)" archivo.txt
grep -E "(agrupación)" archivo.txt
egrep "(agrupación)" archivo.txt

Las expresiones anteriores son equivalentes.

alternancia

Así como los corchetes especifican diferentes coincidencias posibles para un solo carácter, la alternancia le permite especificar coincidencias alternativas para cadenas de caracteres o conjuntos de expresiones.

El carácter de barra vertical "|" se utiliza para indicar alternancia. La alternancia se usa a menudo en la agrupación para indicar que una de dos o más opciones debe considerarse una coincidencia.

En este ejemplo, debe encontrar "GPL" o "Licencia pública general":

grep -E "(GPL|Licencia pública general)" GPL-3
La Licencia Pública General GNU es una licencia gratuita con copyleft para
la Licencia Pública General GNU está destinada a garantizar su libertad para
Licencia Pública General GNU para la mayor parte de nuestro software; también se aplica a
precio. Nuestras Licencias Públicas Generales están diseñadas para asegurarse de que usted
Los desarrolladores que usan GNU GPL protegen sus derechos con dos pasos:
Para la protección de los desarrolladores y autores, la GPL explica claramente
autores", la GPL exige que las versiones modificadas se marquen como
han diseñado esta versión de la GPL para prohibir la práctica para aquellos
...
...

La alternancia se puede utilizar para elegir entre dos o más opciones; para hacer esto, debe ingresar las opciones restantes en el grupo de selección, separando cada una con el carácter de barra vertical "|".

cuantificadores

En las expresiones regulares extendidas, hay metacaracteres que indican con qué frecuencia se repite un carácter, al igual que el metacarácter "*" indica coincidencias del carácter o cadena de caracteres anterior 0 o más veces.

Para indicar que un carácter coincide 0 o más veces, puede utilizar el carácter "?". Hará que el carácter o conjunto de caracteres anterior sea esencialmente opcional.

En este ejemplo, al agregar la secuencia "copiar" al grupo opcional, se muestran las coincidencias "derechos de autor" y "derechos":

grep -E "(copiar)?derecho" GPL-3
Copyright (C) 2007 Free Software Foundation, Inc.
Para proteger sus derechos, debemos evitar que otros se los nieguen
estos derechos o pedirle que renuncie a los derechos. Por lo tanto, tienes
conocer sus derechos.
Los desarrolladores que usan GNU GPL protegen sus derechos con dos pasos:
(1) hacer valer los derechos de autor sobre el software y (2) ofrecerle esta Licencia
"Derechos de autor" también significa leyes similares a las de los derechos de autor que se aplican a otros tipos de
...
...

El símbolo "+" coincide con las expresiones 1 o más veces. Funciona casi como el carácter "*", pero cuando se usa "+", la expresión debe coincidir al menos 1 vez.

La siguiente expresión coincide con la cadena "gratis" más 1 o más caracteres que no sean espacios en blanco:

grep -E "libre[^[:espacio:]]+" GPL-3
La Licencia Pública General GNU es una licencia gratuita con copyleft para
para quitarte la libertad de compartir y cambiar las obras. Por el contrario,
la Licencia Pública General GNU está destinada a garantizar su libertad para
Cuando hablamos de software libre, nos referimos a la libertad, no
tener la libertad de distribuir copias de software libre (y cobrar por

libertades que recibiste. Debe asegurarse de que ellos también reciban
protegiendo la libertad de los usuarios para cambiar el software. La sistemática
de la GPL, según sea necesario para proteger la libertad de los usuarios.
las patentes no se pueden utilizar para hacer que el programa no sea libre.

Número de repeticiones de partidos

Se pueden usar llaves ("( )") para especificar el número de repeticiones de coincidencias. Estos caracteres se utilizan para indicar el número exacto, el rango y los límites superior e inferior del número de veces que una expresión puede coincidir.

Si desea encontrar todas las cadenas que contienen una combinación de tres vocales, puede usar la siguiente expresión:

grep -E "(3)" GPL-3
cambiado, para que sus problemas no sean atribuidos erróneamente a
autores de versiones anteriores.
recibirlo, por cualquier medio, siempre que de manera notoria y
dan en virtud del párrafo anterior, más un derecho a la posesión de la
trabajo cubierto para satisfacer simultáneamente sus obligaciones bajo este
Si necesita encontrar todas las palabras que tienen entre 16 y 20 caracteres, use la siguiente expresión:
grep -E "[[:alfa:]](16,20)" GPL-3
ciertas responsabilidades si distribuye copias del software, o si
lo modificas: responsabilidades de respetar la libertad de los demás.
c) Prohibir la tergiversación del origen de ese material, o

conclusiones

En muchos casos, el comando grep es útil para buscar patrones dentro de los archivos o dentro de la jerarquía del sistema de archivos. Ahorra mucho tiempo, por lo que debe familiarizarse con sus parámetros y sintaxis.

Las expresiones regulares son aún más versátiles y se pueden usar en muchos programas populares. Por ejemplo, muchos editores de texto usan expresiones regulares para buscar y reemplazar texto.

Además, los lenguajes de programación avanzados utilizan expresiones regulares para ejecutar procedimientos en datos específicos. La capacidad de trabajar con expresiones regulares será útil para resolver problemas comunes relacionados con la computadora.

Etiquetas: ,

Para procesar completamente textos en scripts bash con sed y awk, solo necesita comprender las expresiones regulares. Las implementaciones de esta herramienta tan útil se pueden encontrar literalmente en todas partes, y aunque todas las expresiones regulares están organizadas de manera similar, basadas en las mismas ideas, trabajar con ellas tiene ciertas características en diferentes entornos. Aquí hablaremos sobre las expresiones regulares que son adecuadas para usar en los scripts de línea de comandos de Linux.

Este material pretende ser una introducción a las expresiones regulares para aquellos que no saben qué son las expresiones regulares. Por lo tanto, comencemos desde el principio.

¿Qué son las expresiones regulares?

Para muchos, cuando ven por primera vez las expresiones regulares, inmediatamente surge la idea de que tienen un revoltijo de caracteres sin sentido frente a ellos. Pero esto, por supuesto, está lejos de ser el caso. Eche un vistazo a esta expresión regular, por ejemplo


En nuestra opinión, incluso un principiante absoluto comprenderá de inmediato cómo funciona y por qué es necesario :) Si no lo entiende del todo, siga leyendo y todo encajará.
Una expresión regular es un patrón que utilizan programas como sed o awk para filtrar texto. Las plantillas utilizan caracteres ASCII regulares que se representan a sí mismos y los llamados metacaracteres que desempeñan un papel especial, por ejemplo, permitiéndole referirse a ciertos grupos de caracteres.

Tipos de expresiones regulares

Las implementaciones de expresiones regulares en diversos entornos, por ejemplo, en lenguajes de programación como Java, Perl y Python, en herramientas de Linux como sed, awk y grep, tienen ciertas particularidades. Estas características dependen de los llamados motores de procesamiento de expresiones regulares, que se ocupan de la interpretación de patrones.
Linux tiene dos motores de expresiones regulares:
  • Un motor que admite el estándar POSIX Basic Regular Expression (BRE).
  • Un motor que admite el estándar POSIX Extended Regular Expression (ERE).
La mayoría de las utilidades de Linux se ajustan al menos al estándar POSIX BRE, pero algunas utilidades (incluida sed) solo comprenden un subconjunto del estándar BRE. Una de las razones de esta limitación es el deseo de hacer que dichas utilidades sean lo más rápidas posible en el procesamiento de textos.

El estándar POSIX ERE a menudo se implementa en lenguajes de programación. Le permite usar muchas herramientas al desarrollar expresiones regulares. Por ejemplo, pueden ser secuencias de caracteres especiales para patrones de uso frecuente, como la búsqueda de palabras individuales o conjuntos de números en el texto. Awk es compatible con el estándar ERE.

Hay muchas formas de desarrollar expresiones regulares, dependiendo de la opinión del programador y de las características del motor bajo el cual se crean. No es fácil escribir expresiones regulares genéricas que cualquier motor pueda entender. Por lo tanto, nos centraremos en las expresiones regulares más utilizadas y veremos los detalles de su implementación para sed y awk.

Expresiones regulares POSIX BRE

Quizás el patrón BRE más simple es una expresión regular para encontrar una coincidencia exacta de una secuencia de caracteres en el texto. Así es como se ve la búsqueda de una cadena en sed y awk:

$ echo "Esto es una prueba" | sed -n "/prueba/p" $ echo "Esto es una prueba" | awk "/prueba/(imprimir $0)"

Encontrar texto por patrón en sed


Encontrar texto por patrón en awk

Puede notar que la búsqueda de un patrón determinado se realiza sin tener en cuenta la ubicación exacta del texto en la cadena. Además, el número de ocurrencias no importa. Después de que la expresión regular encuentra el texto dado en cualquier parte de la cadena, la cadena se considera adecuada y se pasa para su posterior procesamiento.

Cuando trabaje con expresiones regulares, tenga en cuenta que distinguen entre mayúsculas y minúsculas:

$ echo "Esto es una prueba" | awk "/Prueba/(imprimir $0)" $ echo "Esto es una prueba" | awk "/prueba/(imprimir $0)"

Las expresiones regulares distinguen entre mayúsculas y minúsculas

La primera expresión regular no encontró ninguna coincidencia, ya que la palabra "prueba", que comienza con una letra mayúscula, no aparece en el texto. El segundo, configurado para buscar una palabra escrita en mayúsculas, encontró una cadena adecuada en el flujo.

En las expresiones regulares, puede usar no solo letras, sino también espacios y números:

$ echo "Esta es una prueba 2 otra vez" | awk "/prueba 2/(imprimir $0)"

Encontrar un fragmento de texto que contenga espacios y números

El motor de expresiones regulares trata los espacios como caracteres regulares.

Símbolos especiales

Al usar diferentes caracteres en expresiones regulares, hay algunas cosas a tener en cuenta. Por ejemplo, hay algunos caracteres especiales, o metacaracteres, que requieren un enfoque especial cuando se usan en una plantilla. Aquí están:

.*^${}\+?|()
Si se necesita uno de estos en el patrón, deberá escaparse con una barra invertida (barra invertida) - \ .

Por ejemplo, si necesita encontrar un signo de dólar en el texto, debe incluirlo en la plantilla, precedido por un carácter de escape. Digamos que hay un archivo myfile con el siguiente texto:

Hay 10$ en mi bolsillo
El signo de dólar se puede detectar con un patrón como este:

$ awk "/\$/(imprimir $0)" miarchivo

Uso de un carácter especial en una plantilla

Además, la barra invertida también es un carácter especial, por lo que si desea utilizarlo en una plantilla, también debe escapar de él. Parecen dos barras que se siguen una a la otra:

$ echo "\ es un caracter especial" | awk "/\\/(imprimir $0)"

Barra invertida escapando

Aunque la barra diagonal no se encuentra en la lista anterior de caracteres especiales, intentar usarla en una expresión regular escrita para sed o awk generará un error:

$ echo "3/2" | awk "///(imprimir $0)"

Uso incorrecto de una barra diagonal en una plantilla

Si es necesario, también debe escaparse:

$ echo "3/2" | awk "/\//(imprimir $0)"

Escapar de una barra diagonal

Símbolos de ancla

Hay dos caracteres especiales para anclar un patrón al principio o al final de una cadena de texto. El símbolo de mayúscula - ^ le permite describir secuencias de caracteres que se encuentran al principio de las líneas de texto. Si el patrón que está buscando aparece en otra parte de la cadena, la expresión regular no responderá. El uso de este símbolo se ve así:

$ echo "bienvenido al sitio web de likegeeks" | awk "/^likegeeks/(print $0)" $ echo "sitio web de likegeeks" | awk "/^likegeeks/(imprimir $0)"

Buscar un patrón al principio de una cadena

El símbolo ^ está diseñado para buscar un patrón al principio de una línea, mientras que también se tiene en cuenta el caso de los caracteres. Veamos cómo afectará esto al procesamiento de un archivo de texto:

$ awk "/^this/(print $0)" miarchivo


Busque un patrón al principio de una línea en el texto de un archivo

Al usar sed, si coloca un escape en cualquier lugar dentro de un patrón, se tratará como cualquier otro carácter normal:

$ echo "Esto ^ es una prueba" | sed -n "/s ^/p"

Cap no al inicio del patrón en sed

En awk, cuando se usa el mismo patrón, el carácter dado debe escaparse:

$ echo "Esto ^ es una prueba" | awk "/s \^/(imprimir $0)"

Una tapa no al comienzo de un patrón en awk

Con la búsqueda de fragmentos de texto al comienzo de la línea, lo descubrimos. ¿Qué sucede si necesita encontrar algo al final de una línea?

El signo de dólar - $ , que es el carácter ancla para el final de la línea, nos ayudará con esto:

$ echo "Esto es una prueba" | awk "/prueba$/(imprimir $0)"

Encontrar texto al final de una línea

Ambos caracteres ancla se pueden utilizar en el mismo patrón. Procesemos el archivo myfile , cuyo contenido se muestra en la siguiente figura, usando la siguiente expresión regular:

$ awk "/^esto es una prueba$/(imprimir $0)" miarchivo


Un patrón que usa caracteres especiales para el principio y el final de una cadena

Como puede ver, la plantilla reaccionó solo a una cadena que se correspondía completamente con la secuencia de caracteres dada y su ubicación.

Aquí se explica cómo filtrar líneas vacías usando caracteres de ancla:

$ awk "!/^$/(imprimir $0)" miarchivo
En esta plantilla, utilicé el símbolo de negación, el signo de exclamación - ! . Con este patrón se buscan líneas que no contengan nada entre el principio y el final de la línea y, gracias al signo de exclamación, solo se imprimen las líneas que no coinciden con este patrón.

símbolo de punto

El punto se utiliza para buscar cualquier carácter único, excepto el carácter de nueva línea. Pasemos el archivo myfile a una expresión regular de este tipo, cuyo contenido se muestra a continuación:

$ awk "/.st/(imprimir $0)" miarchivo


Uso de punto en expresiones regulares

Como puede verse en la salida, solo las dos primeras líneas del archivo coinciden con el patrón, ya que contienen la secuencia de caracteres "st" precedida por otro carácter, mientras que la tercera línea no contiene una secuencia adecuada y la cuarta línea lo hace, pero está al principio de la línea.

Clases de personajes

Un punto coincide con cualquier carácter individual, pero ¿qué sucede si desea limitar el conjunto de caracteres que busca de manera más flexible? En tal situación, puede usar clases de caracteres.

Gracias a este enfoque, puede organizar una búsqueda de cualquier carácter de un conjunto determinado. Para describir una clase de carácter, se utilizan corchetes:

$ awk "/th/(imprimir $0)" miarchivo


Descripción de una clase de carácter en una expresión regular

Aquí estamos buscando una secuencia de caracteres "th" precedida por el carácter "o" o el carácter "i".

Las clases son útiles cuando se buscan palabras que pueden comenzar con una letra mayúscula o minúscula:

$ echo "esto es una prueba" | awk "/esto es una prueba/(print $0)" $ echo "Esto es una prueba" | awk "/es una prueba/(imprime $0)"

Buscar palabras que pueden comenzar con una letra minúscula o mayúscula

Las clases de caracteres no se limitan a letras. Aquí también se pueden utilizar otros caracteres. Es imposible decir de antemano en qué situación se necesitarán las clases; todo depende del problema que se resuelva.

Negación de clases de caracteres

Las clases de símbolos también se pueden usar para resolver el problema inverso descrito anteriormente. Es decir, en lugar de buscar símbolos incluidos en la clase, puede organizar una búsqueda de todo lo que no está incluido en la clase. Para lograr este comportamiento de una expresión regular, debe colocar un signo ^ delante de la lista de caracteres de clase. Se parece a esto:

$ awk "/[^oi]th/(print $0)" miarchivo


Buscar personajes que no estén en una clase

En este caso, se encontrarán secuencias de caracteres "th", delante de las cuales no hay ni "o" ni "i".

Rangos de caracteres

En las clases de caracteres, puede describir rangos de caracteres usando guiones:

$ awk "/st/(imprimir $0)" miarchivo


Describir un rango de caracteres en una clase de caracteres

En este ejemplo, la expresión regular coincide con la secuencia de caracteres "st" precedida por cualquier carácter ubicado, en orden alfabético, entre los caracteres "e" y "p".

Los rangos también se pueden crear a partir de números:

$ echo "123" | awk "//" $ echo "12a" | awk "//"

Expresión regular para encontrar tres números

Una clase de carácter puede contener múltiples rangos:

$ awk "/st/(imprimir $0)" miarchivo


Clase de carácter que consta de múltiples rangos

Esta expresión regular coincidirá con todas las secuencias de "st" precedidas por caracteres de los rangos a-f y m-z.

Clases de personajes especiales

BRE tiene clases de caracteres especiales que se pueden usar al escribir expresiones regulares:
  • [[:alpha:]] - coincide con cualquier carácter alfabético escrito en mayúsculas o minúsculas.
  • [[:alnum:]]: coincide con cualquier carácter alfanumérico, es decir, caracteres en los rangos 0-9 , A-Z , a-z .
  • [[:blank:]] - Coincide con un espacio y una tabulación.
  • [[:digit:]] - cualquier carácter numérico del 0 al 9 .
  • [[:upper:]] - caracteres alfabéticos en mayúsculas - A-Z .
  • [[:lower:]] - caracteres alfabéticos en minúsculas - a-z .
  • [[:print:]] - coincide con cualquier carácter imprimible.
  • [[:punct:]] - Coincide con los signos de puntuación.
  • [[:espacio:]] - caracteres de espacio en blanco, en particular - espacio, tabulador, caracteres NL , FF , VT , CR .
Puedes usar clases especiales en plantillas como esta:

$ echo "abc" | awk "/[[:alfa:]]/(imprimir $0)" $ echo "abc" | awk "/[[:dígito:]]/(imprimir $0)" $ echo "abc123" | awk "/[[:dígito:]]/(imprimir $0)"


Clases de caracteres especiales en expresiones regulares

Símbolo de asterisco

Si coloca un asterisco después de un carácter en un patrón, significará que la expresión regular funcionará si el carácter aparece en la cadena varias veces, incluida la situación en la que el carácter está ausente en la cadena.

$ echo "prueba" | awk "/tes*t/(imprimir $0)" $ echo "tessst" | awk "/prueba*t/(imprimir $0)"


Uso del carácter * en expresiones regulares

Este carácter comodín se suele utilizar para trabajar con palabras que se escriben mal todo el tiempo, o para palabras que se pueden escribir de forma diferente:

$ echo "Me gusta el color verde" | awk "/color*r/(imprimir $0)" $ echo "Me gusta el color verde" | awk "/color*r/(imprimir $0)"

Encontrar una palabra que tiene diferentes ortografías

En este ejemplo, la misma expresión regular coincide tanto con la palabra "color" como con la palabra "color". Esto se debe al hecho de que el carácter "u", seguido de un asterisco, puede estar ausente o aparecer varias veces seguidas.

Otra característica útil derivada del carácter asterisco es combinarlo con un punto. Esta combinación permite que la expresión regular responda a cualquier número de caracteres:

$ awk "/this.*test/(print $0)" miarchivo


Plantilla que responde a cualquier número de caracteres

En este caso, no importa cuántos y qué caracteres haya entre las palabras "esto" y "prueba".

El asterisco también se puede utilizar con clases de caracteres:

$ echo "st" | awk "/s*t/(imprimir $0)" $ echo "sat" | awk "/s*t/(imprimir $0)" $ echo "establecer" | awk "/mierda/(imprimir $0)"


Uso del asterisco con clases de caracteres

En los tres ejemplos, la expresión regular funciona porque el asterisco después de la clase de carácter significa que si se encuentra cualquier número de caracteres "a" o "e", o si no se encuentran, la cadena coincidirá con el patrón dado.

Expresiones regulares POSIX ERE

Las plantillas POSIX ERE que admiten algunas utilidades de Linux pueden contener caracteres adicionales. Como ya se mencionó, awk admite este estándar, pero sed no.

Aquí veremos los caracteres más utilizados en los patrones ERE, que le resultarán útiles a la hora de crear sus propias expresiones regulares.

▍Signo de interrogación

El signo de interrogación indica que el carácter anterior puede aparecer una vez o no aparecer en absoluto en el texto. Este carácter es uno de los metacaracteres de repetición. Aquí hay unos ejemplos:

$ echo "teto" | awk "/pruebas?t/(imprimir $0)" $ echo "prueba" | awk "/prueba?t/(imprimir $0)" $ echo "prueba" | awk "/prueba?t/(imprimir $0)"


Signo de interrogación en expresiones regulares

Como puedes ver, en el tercer caso, la letra “s” aparece dos veces, por lo que la expresión regular no responde a la palabra “tesst”.

El signo de interrogación también se puede utilizar con clases de caracteres:

$ echo "tst" | awk "/t?st/(imprimir $0)" $ echo "prueba" | awk "/t?st/(imprimir $0)" $ echo "tast" | awk "/t?st/(imprimir $0)" $ echo "taest" | awk "/t?st/(imprimir $0)" $ echo "teest" | awk "/t?st/(imprimir $0)"


Signos de interrogación y clases de caracteres

Si no hay caracteres de la clase en la cadena, o uno de ellos aparece una vez, la expresión regular funciona, pero tan pronto como aparecen dos caracteres en la palabra, el sistema ya no encuentra una coincidencia para el patrón en el texto.

▍Símbolo más

El signo más en el patrón indica que la expresión regular coincidirá con la coincidencia si el carácter anterior aparece una o más veces en el texto. Al mismo tiempo, tal construcción no reaccionará ante la ausencia de un símbolo:

$ echo "prueba" | awk "/te+st/(imprimir $0)" $ echo "teest" | awk "/te+st/(imprimir $0)" $ echo "tst" | awk "/te+st/(imprimir $0)"


Signo más en expresiones regulares

En este ejemplo, si no hay un carácter "e" en la palabra, el motor de expresiones regulares no encontrará coincidencias en el texto. El símbolo más también funciona con clases de caracteres; de esta manera, es similar al asterisco y al signo de interrogación:

$ echo "tst" | awk "/t+st/(imprimir $0)" $ echo "prueba" | awk "/t+st/(imprimir $0)" $ echo "teast" | awk "/t+st/(imprimir $0)" $ echo "teeast" | awk "/t+st/(imprimir $0)"


Clases de signos y caracteres más

En este caso, si la cadena contiene algún carácter de la clase, se considerará que el texto coincide con el patrón.

▍ llaves

Los corchetes que se pueden usar en patrones ERE son similares a los caracteres discutidos anteriormente, pero le permiten especificar con mayor precisión el número requerido de ocurrencias del carácter que los precede. Puede especificar un límite en dos formatos:
  • n - un número que especifica el número exacto de ocurrencias buscadas
  • n, m - dos números que se interpretan de la siguiente manera: "al menos n veces, pero no más de m".
Aquí hay ejemplos de la primera opción:

$ echo "tst" | awk "/te(1)st/(imprimir $0)" $ echo "prueba" | awk "/te(1)st/(imprimir $0)"

Llaves en patrones, encontrar el número exacto de ocurrencias

En versiones anteriores de awk, tenía que usar el interruptor de línea de comando --re-interval para que el programa reconociera intervalos en expresiones regulares, pero en versiones más nuevas no lo hace.

$ echo "tst" | awk "/te(1,2)st/(imprimir $0)" $ echo "prueba" | awk "/te(1,2)st/(imprimir $0)" $ echo "teest" | awk "/te(1,2)st/(imprimir $0)" $ echo "teeest" | awk "/te(1,2)st/(imprimir $0)"


Espaciado dado entre llaves

En este ejemplo, el carácter "e" debe aparecer 1 o 2 veces en la cadena, luego la expresión regular responderá al texto.

Las llaves también se pueden usar con clases de caracteres. Los principios que ya le son familiares se aplican aquí:

$ echo "tst" | awk "/t(1,2)st/(imprimir $0)" $ echo "prueba" | awk "/t(1,2)st/(imprimir $0)" $ echo "teest" | awk "/t(1,2)st/(imprimir $0)" $ echo "teeast" | awk "/t(1,2)st/(imprimir $0)"


Llaves y clases de caracteres

La plantilla reaccionará al texto si el carácter "a" o el carácter "e" aparecen una o dos veces en él.

▍Símbolo lógico “o”

Símbolo | - una barra vertical, significa un "o" lógico en expresiones regulares. Al procesar una expresión regular que contiene varios fragmentos separados por dicho carácter, el motor considerará el texto analizado como una coincidencia si coincide con alguno de los fragmentos. Aquí hay un ejemplo:

$ echo "Esto es una prueba" | awk "/prueba|examen/(imprimir $0)" $ echo "Esto es un examen" | awk "/prueba|examen/(imprimir $0)" $ echo "Esto es otra cosa" | awk "/prueba|examen/(imprimir $0)"


Booleano "o" en expresiones regulares

En este ejemplo, la expresión regular está configurada para buscar las palabras "prueba" o "examen" en el texto. Preste atención al hecho de que entre los fragmentos de plantilla y el | símbolo que los separa. no debe haber espacios.

Los fragmentos de expresiones regulares se pueden agrupar mediante paréntesis. Si agrupa una determinada secuencia de caracteres, el sistema la percibirá como un carácter normal. Es decir, por ejemplo, se le pueden aplicar metacaracteres de repetición. Esto es lo que parece:

$ echo "Me gusta" | awk "/Me gusta(Geeks)?/(imprimir $0)" $ echo "Me gustaGeeks" | awk "/Me gusta (Geeks)?/(imprimir $0)"


Agrupación de fragmentos de expresiones regulares

En estos ejemplos, la palabra "Geeks" está entre paréntesis, seguida de un signo de interrogación. Recuerde que el signo de interrogación significa "0 o 1 repetición", como resultado, la expresión regular coincidirá tanto con la cadena "Me gusta" como con la cadena "LikeGeeks".

Ejemplos prácticos

Ahora que hemos cubierto los conceptos básicos de las expresiones regulares, es hora de hacer algo útil con ellas.

▍Contar el número de archivos

Escribamos un script bash que cuente los archivos ubicados en directorios que se escriben en la variable de entorno PATH. Para hacer esto, primero deberá crear una lista de rutas a los directorios. Hagamos esto con sed, reemplazando los dos puntos con espacios:

$ echo $RUTA | sed "s/:/ /g"
El comando replace admite expresiones regulares como patrones para buscar texto. En este caso, todo es extremadamente simple, estamos buscando un símbolo de dos puntos, pero nadie se molesta en usar otra cosa aquí, todo depende de la tarea específica.
Ahora debemos revisar la lista resultante en un bucle y realizar las acciones necesarias para contar la cantidad de archivos allí. El esquema general del script será el siguiente:

Mypath=$(echo $PATH | sed "s/:/ /g") para el directorio en $mypath do done
Ahora escribamos el texto completo del script, usando el comando ls para obtener información sobre la cantidad de archivos en cada uno de los directorios:

#!/bin/bash mypath=$(echo $PATH | sed "s/:/ /g") count=0 para el directorio en $mypath do check=$(ls $directory) para el elemento en $check do count=$ [ $recuento + 1 ] hecho echo "$directorio - $recuento" recuento=0 hecho
Al ejecutar el script, puede resultar que algunos directorios de PATH no existan, sin embargo, esto no evitará que cuente archivos en directorios existentes.


Recuento de archivos

El valor principal de este ejemplo es que usando el mismo enfoque, puede resolver problemas mucho más complejos. Cuál depende de tus necesidades.

▍Verificación de direcciones de correo electrónico

Hay sitios web con grandes colecciones de expresiones regulares que le permiten verificar direcciones de correo electrónico, números de teléfono, etc. Sin embargo, una cosa es tomar ready-made y otra muy distinta crear algo uno mismo. Así que escribamos una expresión regular para validar las direcciones de correo electrónico. Comencemos con el análisis de los datos iniciales. Por ejemplo, aquí hay una dirección:

[correo electrónico protegido]
El nombre de usuario, nombre de usuario, puede constar de caracteres alfanuméricos y algunos otros caracteres. Es decir, este es un punto, una raya, un guión bajo y un signo más. El nombre de usuario va seguido del signo @.

Armados con este conocimiento, comencemos a ensamblar la expresión regular desde su lado izquierdo, que sirve para verificar el nombre de usuario. Esto es lo que tenemos:

^(+)@
Esta expresión regular se puede leer de la siguiente manera: "Al principio de la línea debe haber al menos un carácter de los del grupo dado entre corchetes, y después de eso debe haber un signo @".

Ahora es la cola de nombre de host - hostname. Aquí se aplican las mismas reglas que para el nombre de usuario, por lo que la plantilla se vería así:

(+)
El nombre de dominio de nivel superior está sujeto a reglas especiales. Solo puede haber caracteres alfabéticos, que deben ser al menos dos (por ejemplo, dichos dominios suelen contener un código de país) y no más de cinco. Todo esto significa que la plantilla para verificar la última parte de la dirección será así:

\.({2,5})$
Puede leerlo así: "Primero debe haber un punto, luego, de 2 a 5 caracteres alfabéticos, y luego termina la línea".

Habiendo preparado los patrones para las partes individuales de la expresión regular, juntémoslos:

^(+)@(+)\.({2,5})$
Ahora solo queda probar lo que sucedió:

$eco" [correo electrónico protegido]" | awk "/^(+)@(+)\.((2,5))$/(imprimir $0)" $ echo " [correo electrónico protegido]" | awk "/^(+)@(+)\.((2,5))$/(imprimir $0)"


Validación de una dirección de correo electrónico con expresiones regulares

El hecho de que el texto pasado a awk se muestre en la pantalla significa que el sistema lo reconoció como una dirección de correo electrónico.

Resultados

Si la expresión regular para verificar las direcciones de correo electrónico que conoció al principio del artículo le parecía completamente incomprensible, esperamos que ahora ya no parezca un conjunto de caracteres sin sentido. Si esto es cierto, entonces este material ha cumplido su propósito. De hecho, las expresiones regulares son un tema que puedes estudiar toda tu vida, pero incluso lo poco que hemos analizado ya puede ayudarte a escribir scripts que procesen textos de una manera bastante avanzada.

En esta serie de materiales, generalmente mostramos ejemplos muy simples de scripts bash que literalmente consistían en unas pocas líneas. Veamos algo más grande la próxima vez.

¡Queridos lectores! ¿Utiliza expresiones regulares al procesar texto en secuencias de comandos de línea de comandos?

Acerca de este tutorial

Bienvenido a Conceptos básicos de administración, el segundo de cuatro tutoriales diseñados para prepararlo para el Examen 101 en el Linux Professional Institute. En esta parte, veremos cómo usar expresiones regulares para buscar texto en archivos basados ​​en patrones. Luego, se familiarizará con el "Estándar de jerarquía del sistema de archivos" (Filesystem Hierarchy Standard o FHS para abreviar), y también le mostraremos cómo encontrar los archivos que necesita en su sistema. Después de eso, aprenderá cómo tomar el control total de los procesos de Linux ejecutándolos en segundo plano, enumerando procesos, separándolos de la terminal y más. Lo que sigue es una introducción rápida a las canalizaciones, los redireccionamientos y los comandos de procesamiento de texto. Finalmente, le presentaremos los módulos del kernel de Linux.

En particular, esta parte del tutorial (Parte 2) es ideal para quienes ya tienen un buen conocimiento básico de bash y desean una buena introducción a las tareas básicas de administración de Linux. Si es nuevo en Linux, le recomendamos que primero complete la primera parte de esta serie de instrucciones. Para algunos, la mayor parte de este material será nuevo, pero los usuarios de Linux más experimentados pueden encontrar una excelente manera de resumir sus habilidades administrativas básicas.



Si estudió el primer número de este tutorial con un propósito que no sea estudiar para el examen LPI, es posible que no necesite volver a leer este número. Sin embargo, si planea realizar el examen, le recomendamos encarecidamente que vuelva a leer esta versión revisada del tutorial.

Expresiones regulares

¿Qué es una "expresión regular"?

Una expresión regular (según la expresión regular en inglés, abreviatura "regexp" o "regex", en el país de origen a veces se llama "regular" - aprox. Lane) es una sintaxis especial que se usa para describir patrones de texto. En los sistemas Linux, las expresiones regulares se usan ampliamente para la coincidencia de patrones en el texto y para operaciones de búsqueda y reemplazo en secuencias de texto.

En comparación con el englobamiento

Una vez que comencemos a ver las expresiones regulares, puede notar que su sintaxis es muy similar a la sintaxis de los nombres de archivos que vimos en la primera parte. Sin embargo, no se equivoque, esta similitud es muy superficial. Las expresiones regulares y los patrones globales, incluso cuando se ven similares, son cosas fundamentalmente diferentes.

subcadena simple

Con esa advertencia fuera del camino, veamos lo más básico sobre las expresiones regulares, la subcadena más simple. Para hacer esto, usaremos "grep", un comando que escanea el contenido de un archivo de acuerdo con una expresión regular dada. grep imprime cada línea que coincide con la expresión regular, ignorando el resto:

$ grep bash /etc/contraseña
operador:x:11:0:operador:/raíz:/bin/bash raíz:x:0:0::/raíz:/bin/bash ftp:x:40:1::/home/ftp:/bin/ intento

Arriba, el primer parámetro para grep es regex; el segundo es el nombre del archivo. grep lee cada línea de /etc/contraseña y aplicó una simple subcadena de expresiones regulares "bash" en busca de una coincidencia. Si se encontró una coincidencia, entonces grep imprimió la línea completa; de lo contrario, la línea fue ignorada.

Entendiendo una subcadena simple

En general, si está buscando una subcadena, simplemente puede especificarla literalmente, sin usar ningún carácter "especial". Solo debe tener especial cuidado si su subcadena contiene +, ., *, [, ] o \, en cuyo caso esos caracteres deben escaparse con una barra invertida y la subcadena entre comillas. Estos son algunos ejemplos de expresiones regulares como una subcadena simple:

  • /tmp (busque la línea /tmp)
  • "\" (búsqueda de cadena)
  • "\*gracioso\*" (busque la cadena *gracioso*)
  • "ld\.so" (busque la cadena ld.so)

Metacaracteres

Con expresiones regulares usando metacaracteres, es posible realizar búsquedas mucho más complejas que en los ejemplos que se han considerado recientemente. Uno de esos metacaracteres es "." (punto), que coincide con cualquier carácter individual:

$ grep dev.sda /etc/fstab
/dev/sda3 / reiserfs noatime,ro 1 1 /dev/sda1 /boot reiserfs noauto,noatime,notail 1 2 /dev/sda2 swap swap sw 0 0 #/dev/sda4 /mnt/extra reiserfs noatime,rw 1 1

En este ejemplo, el texto dev.sda no aparece literalmente en ninguna de las líneas en /etc/fstab. Sin embargo, grep no busca literalmente la línea dev.sda, sino el patrón dev.sda. Recuerda eso "." coincidirá con cualquier carácter individual. Como puede ver, el "." es funcionalmente equivalente a cómo funciona el metacarácter "?". en sustituciones globales.

Uso

Si queremos especificar un carácter más específicamente que ".", podemos usar [ y ] (corchetes) para especificar un subconjunto de caracteres para que coincida:

$ grep dev.sda /etc/fstab
/dev/sda1 /boot reiserfs noauto,noatime,notail 1 2 /dev/sda2 swap swap 0 0

Como puede ver, en particular, esta construcción sintáctica funciona de manera idéntica a la construcción "" en la sustitución de nombre de archivo global. Nuevamente, esta es una de las ambigüedades en el aprendizaje de expresiones regulares: la sintaxis es similar, pero no idéntica, a las sustituciones globales, lo cual es confuso.

Usando [^]

Puede invertir el significado de los corchetes colocando un ^ justo después del [. En este caso, los corchetes coincidirán con cualquier carácter que NO figure dentro de ellos. Nuevamente, observe que usamos [^] con regex y [!] con glob:

$ grep dev.hda[^12] /etc/fstab
/dev/hda3 / reiserfs noatime,ro 1 1 #/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1

Sintaxis diferente

Es muy importante tener en cuenta que la sintaxis dentro de los corchetes es fundamentalmente diferente del resto de la expresión regular. Por ejemplo, si pones "." dentro de los corchetes, esto permitirá que los corchetes coincidan con "." literalmente, como 1 y 2 en el ejemplo anterior. Para comparacion, "." colocado fuera de los corchetes se interpretará como un metacarácter a menos que se anteponga "\". Podemos aprovechar este hecho para imprimir líneas desde /etc/fstab que contengan la línea dev.sda tal como está escrita:

$ grep dev[.]sda /etc/fstab

Además, podríamos escribir:

$ grep "dev\.sda" /etc/fstab

Estas expresiones regulares probablemente no coincidan con ninguna de sus líneas. /etc/fstab archivo.

Símbolo matemático *

Algunos metacaracteres por sí mismos no coinciden con nada, pero cambian el significado del carácter anterior. Uno de esos caracteres es * (asterisco), que se utiliza para hacer coincidir cero o más apariciones del carácter anterior. Tenga en cuenta que esto significa que * tiene un significado diferente en expresiones regulares que en globbing. Aquí hay algunos ejemplos, y preste especial atención a los casos en los que la coincidencia de expresiones regulares difiere de las sustituciones globales:

  • a B C coincide con "abbbbc" pero no con "abqc" (en el caso de sustitución global, ambas cadenas coincidirán con el patrón. ¿Entiendes por qué?)
  • a B C coincide con "abc" pero no con "abbqbbc" (nuevamente, con la sustitución global, el patrón coincide con ambas cadenas)
  • a B C coincide con "ac" pero no con "cba" (en caso de globbing, ni "ac" ni "cba" coinciden con el patrón)
  • ser coincide con "bqe" y "be" (la sustitución global coincide con "bqe" pero no con "be")
  • ser coincide con "bccqqe" pero no con "bccc" (al globbing, el patrón también coincidirá con el primero, pero no con el segundo)
  • ser coincide con "bqqcce" pero no con "cqe" (lo mismo con la sustitución global)
  • ser satisface "bbbeee" (pero no en caso de globbing)
  • .* coincide con cualquier cadena (la sustitución global solo coincide con las cadenas que comienzan con ".")
  • Foo.* coincidirá con cualquier subcadena que comience con "foo" (en el caso de sustitución global, este patrón coincidirá con cadenas que comiencen con los cuatro caracteres "foo").

Entonces, para recapitular, la cadena "ac" coincide con la expresión regular "ab*c" porque el asterisco también permite que la expresión anterior (b) se repita cero veces. Y nuevamente, vale la pena notar que el metacarácter * en las expresiones regulares se interpreta de manera completamente diferente que el carácter * en las sustituciones globales.

Principio y final de línea.

Los últimos metacaracteres que veremos en detalle son ^ y $, que se utilizan para hacer coincidir el principio y el final de una cadena, respectivamente. Al usar ^ al comienzo de su expresión regular, "adjunta" su patrón al comienzo de la línea. En el siguiente ejemplo, usamos la expresión regular ^#, que coincide con cualquier cadena que comience con un carácter #:

$ grep ^# /etc/fstab

#

Expresiones regulares de línea completa

^ y $ se pueden combinar para que coincidan con la cadena completa. Por ejemplo, la siguiente expresión regular coincidirá con cadenas que comienzan con # y terminan con ".", con un número arbitrario de caracteres entre ellas:

$ grep "^#.*\.$" /etc/fstab
# /etc/fstab: información del sistema de archivos estático.

En el ejemplo anterior, encerramos nuestra expresión regular entre comillas simples para evitar que el shell interprete el carácter $. Sin las comillas simples, $ habría desaparecido de nuestra expresión regular antes de que grep pudiera verlo.

Acerca de los autores

Daniel Robbins

Daniel Robbins es el fundador de la comunidad Gentoo y creador del sistema operativo Gentoo Linux. Daniel vive en Nuevo México con su esposa Mary y sus dos enérgicas hijas. También es el fundador y director de Funtoo, y ha escrito numerosos artículos técnicos para IBM developerWorks, Intel Developer Services y C/C++ Users Journal.

chris houser

Chris Houser ha sido un defensor de UNIX desde 1994, cuando se unió al equipo de administración de la Universidad de Taylor, Indiana, EE. UU., donde obtuvo una licenciatura en informática y matemáticas. Desde entonces, ha trabajado en una variedad de áreas que incluyen aplicaciones web, edición de video, controladores UNIX y seguridad criptográfica. Actualmente trabaja en Sentry Data Systems. Chris también ha contribuido a muchos proyectos de código abierto como Gentoo Linux y Clojure y es coautor de The Joy of Clojure.

Aron Griffis

Eiron Griffis vive en el área de Boston, donde pasó la última década trabajando para Hewlett-Packard en proyectos como controladores de red UNIX para Tru64, certificación de seguridad Linux, virtualización Xen y KVM y, más recientemente, la plataforma HP ePrint. En su tiempo libre de programación, Aaron prefiere reflexionar sobre los problemas de la programación mientras anda en bicicleta, hace malabarismos con los bates o anima al equipo de béisbol profesional Boston Red Sox.

grep significa 'impresora de expresión regular global'. grep elimina las líneas que desea de los archivos de texto que contienen texto especificado por el usuario.

grep se puede usar de dos maneras: solo o en combinación con flujos.

grep es muy rico en funcionalidad, debido a la gran cantidad de opciones que admite, como: buscar usando un patrón de cadena o un patrón de expresión regular RegExp o una expresión regular basada en perl, etc.

Debido a sus diversas funcionalidades, la herramienta grep tiene muchas opciones, que incluyen egrep (GREP extendido), fgrep (GREP fijo), pgrep (ProcesoGREP), rgrep (GREP recursivo) etc. Pero estas variantes tienen pequeñas diferencias con el grep original.

opciones de grep

$ grep -V grep (GNU grep) 2.10 Copyright (C) 2011 Free Software Foundation, Inc. Licencia GPLv3+

Hay modificaciones de la utilidad grep: egrep (con procesamiento de expresiones regulares extendidas), fgrep (tratando $*^|()\ caracteres como literales, es decir, literalmente), rgrep (con búsqueda recursiva habilitada).

    egrep es lo mismo que grep -E

    fgrep es lo mismo que grep -F

    rgrep es lo mismo que grep -r

    grep [-b] [-c] [-i] [-l] [-n] [-s] [-v] restrict_regex_BRE [archivo...]

El comando grep hace coincidir las líneas de los archivos de origen con el patrón proporcionado por limited_regular_expression. Si no se especifica ningún archivo, se utiliza la entrada estándar. Por lo general, cada línea coincidente con éxito se copia en la salida estándar; si hay varios archivos fuente, la cadena encontrada está precedida por el nombre del archivo. grep utiliza un algoritmo compacto no determinista. Las expresiones regulares limitadas se aceptan como patrones (expresiones que tienen cadenas de caracteres como valores y utilizan un conjunto limitado de caracteres alfanuméricos y especiales). Tienen el mismo significado que las expresiones regulares en ed.

La forma más fácil de escapar de los caracteres $, *, , ^, |, () y \ de la interpretación del shell es encerrar la expresión_regular_restringida entre comillas simples.

Opciones:

B Prefija cada línea con el número de bloque en el que se encontró. Esto puede ser útil cuando se buscan bloques por contexto (los bloques se numeran desde 0). -c Devuelve solo el número de líneas que contienen el patrón. -h Evita que el nombre de archivo que contiene la cadena coincidente se imprima antes de la cadena real. Se utiliza cuando se busca en varios archivos. -i Ignora mayúsculas y minúsculas en las comparaciones. -l Imprime solo los nombres de los archivos que contienen líneas coincidentes, uno por línea. Si el patrón se encuentra en varias líneas de un archivo, el nombre del archivo no se repite. -n Prefije cada línea con su número en el archivo (las líneas se numeran desde 1). -s Suprime la notificación de archivos inexistentes o ilegibles. -v Imprime todas las líneas excepto las que contienen un patrón. -w Busca la expresión como una palabra, como si estuviera rodeada por los metacaracteres \< и \>.

grep --ayuda

Uso: grep [OPCIÓN]… PATRÓN [ARCHIVO]… Busque PATRÓN en cada ARCHIVO o entrada estándar. Por defecto, PATTERN es una expresión regular simple (BRE). Ejemplo: grep -i "hola mundo" menu.h main.c Seleccionar un tipo de expresión regular e interpretarlo: -E, --extended-regexp PATRÓN - expresión regular extendida (ERE) -F, --fixed-regexp PATRÓN - cadenas longitud fija, nueva línea separada -G, --basic-regexp PATRÓN - expresión regular simple (BRE) -P, --perl-regexp PATRÓN - expresión regular de Perl -e, --regexp=PATRÓN usar PATRÓN para búsqueda - f, --file=ARCHIVO tomar PATRÓN de ARCHIVO -i, --ignore-case ignorar diferencia de mayúsculas y minúsculas -w, --word-regexp PATRÓN debe coincidir con todas las palabras -x, --line-regexp PATRÓN debe coincidir con toda la línea -z, - -null-data cadenas separadas con un byte nulo, no un carácter de fin de línea -version imprime la información de la versión y sale --ayuda para mostrar esta ayuda y salir --mmap para compatibilidad con versiones anteriores, ignorado Control de salida: -m, --max- count=NUM detener después de que el NUM especificado coincida con -b, --byte- offset imprimir junto con las líneas de salida desplazadas en bytes -n, --line-number imprimir el número de línea junto con las líneas de salida --line-buffered flush buffer después de cada línea - H, --with-filename imprime el nombre de archivo para cada coincidencia -h , --no-filename no inicia la salida con el nombre de archivo --label=LABEL usa LABEL como nombre de archivo para la entrada estándar -o, --only-matching muestra solo una parte de línea que coincide con PATRÓN -q, --quiet, - -silent suprime toda la salida normal --binary-files=TYPE trata el archivo binario como TIPO: binario, texto o sin coincidencia. -a, --texto igual que --binary-files=texto -I igual que --binary-files=sin-coincidencia -d, --directories=ACTION cómo manejar directorios ACTION puede ser leído (read), recurse ( recursivamente) o saltar (skip). -D, --devices=ACTION cómo manejar dispositivos, FIFO y sockets ACTION se puede leer u omitir -R, -r, --recursive igual que --directories=recurse --include=F_PATTERN procesa solo archivos que coinciden con PATTERN --exclude=PATRÓN omitir archivos y directorios que coincidan con PATRÓN --exclude-from=ARCHIVO omitir archivos que coincidan con archivos de patrón de ARCHIVO --exclude-dir=PATRÓN directorios que coincidan con PATRÓN se omitirán -L, - -archivos sin coincidencia imprimir sólo Nombres de ARCHIVO sin coincidencias -l, --files-with-matches imprime solo nombres de ARCHIVO con coincidencias -c, --count imprime solo el número de líneas coincidentes por ARCHIVO -T, --initial-tab alinear pestaña (si es necesario) -Z , --null imprime el byte 0 después del nombre del ARCHIVO Gestión de contexto: -B, --before-context=NUM imprime NUM líneas del contexto anterior -A, --after-context=NUM imprime NUM líneas del contexto posterior -C, -- contexto[=NUM] imprime NUM líneas de contexto -NUM igual que --context=NUM --color[=CUÁNDO], --color[=CUÁNDO] usa marcadores para distinguir las líneas coincidentes; CUÁNDO puede ser siempre (siempre), nunca (nunca) o automático (automáticamente) -U, --binary no elimine los caracteres CR al final de la línea (MSDOS) -u, --unix-byte-offsets proporcione el desplazamiento como si no CR (MSDOS) En lugar de "egrep", se supone que debe ejecutar "grep -E". Se supone que "fgrep" es "grep -F". Es mejor evitar la ejecución como "egrep" o "fgrep". Cuando no se proporciona FILE, o cuando FILE es -, se lee la entrada estándar. Si se especifican menos de dos archivos, se asume -h. Si se encuentra una coincidencia, el código de salida del programa será 0 y, en caso contrario, 1. Si se producen errores o si no se especifica la opción -q, el código de salida será 2. Informe los errores a Reportar errores en la traducción a Página de inicio de GNU Grep: Ayuda para trabajar con programas GNU:

Las expresiones regulares son una herramienta muy poderosa para la coincidencia de patrones, el procesamiento y la modificación de cadenas que se pueden usar para resolver muchos problemas. Aquí están los principales:

  • Comprobación de la entrada de texto;
  • Buscar y reemplazar texto en un archivo;
  • Renombrar archivos por lotes;
  • Interacción con servicios como Apache;
  • Comprobación de una cadena contra un patrón.

Esta no es una lista completa, las expresiones regulares le permiten hacer mucho más. Pero para los nuevos usuarios, pueden parecer demasiado complicados, ya que se utiliza un lenguaje especial para formarlos. Pero dado el poder que proporciona, cada administrador de sistemas debería saber y poder usar las expresiones regulares de Linux.

En este artículo, vamos a cubrir las expresiones regulares de bash para principiantes para que pueda comprender todas las características de esta herramienta.

Se pueden utilizar dos tipos de caracteres en las expresiones regulares:

  • letras regulares;
  • metacaracteres.

Los caracteres regulares son letras, números y signos de puntuación que componen cualquier cadena. Todos los textos están formados por letras y puede utilizarlas en expresiones regulares para encontrar la posición deseada en el texto.

Los metacaracteres son otra cosa, son los que dan poder a las expresiones regulares. Con los metacaracteres, puede hacer mucho más que buscar un solo carácter. Puede buscar combinaciones de caracteres, usar un número dinámico de caracteres y seleccionar rangos. Todos los caracteres especiales se pueden dividir en dos tipos, estos son caracteres de reemplazo que reemplazan a los caracteres comunes u operadores que indican cuántas veces se puede repetir un carácter. La sintaxis de una expresión regular se vería así:

simbolo_regular operador_de_caracteres especiales

comodín_reemplazo operador_de_caracteres especiales

  • \ - los caracteres especiales literales comienzan con una barra invertida, y también se usa si necesita usar un carácter especial en forma de signo de puntuación;
  • ^ - indica el comienzo de la línea;
  • $ - indica el final de la línea;
  • * - indica que el carácter anterior se puede repetir 0 o más veces;
  • + - indica que el carácter anterior debe repetirse más de una o más veces;
  • ? - el carácter anterior puede ocurrir cero o una vez;
  • (norte)- especifica cuántas veces (n) repetir el carácter anterior;
  • (n, n)- el carácter anterior se puede repetir de N a n veces;
  • . - cualquier carácter excepto avance de línea;
  • - cualquier carácter especificado entre paréntesis;
  • x|y- símbolo x o símbolo y;
  • [^az]- cualquier carácter, excepto los indicados entre paréntesis;
  • - cualquier caracter del rango especificado;
  • [^a-z]- cualquier carácter que no esté en el rango;
  • \b- denota un límite de palabra con un espacio;
  • \B- significa que el carácter debe estar dentro de una palabra, por ejemplo, ux coincidirá con uxb o tuxedo, pero no con Linux;
  • \d- significa que el carácter es un dígito;
  • \D- carácter no numérico;
  • \norte- carácter de nueva línea;
  • \s- uno de los caracteres de espacio, espacio, tabulador, etc.;
  • \S- cualquier caracter excepto un espacio;
  • \t- carácter de tabulación;
  • \v- carácter de tabulación vertical;
  • \w- cualquier carácter alfabético, incluido el guión bajo;
  • \W- cualquier carácter alfabético, excepto guión bajo;
  • \uXXX- Símbolo Unicdo.

Es importante tener en cuenta que se debe usar una barra inclinada antes de los caracteres especiales literales para indicar que sigue el carácter especial. Lo contrario también es cierto, si desea usar un carácter especial que se usa sin una barra como un carácter normal, entonces debe agregar una barra.

Por ejemplo, desea encontrar la cadena 1+ 2=3 en el texto. Si usa esta cadena como una expresión regular, no encontrará nada, porque el sistema interpreta el signo más como un carácter especial que dice que el anterior debe repetirse una o más veces. Por lo tanto, debe escaparse: 1 \+ 2 = 3. Sin escapar, nuestra expresión regular solo coincidiría con la cadena 11=3 o 111=3, y así sucesivamente. No necesita poner un guión antes de los iguales, porque no es un carácter especial.

Ejemplos de expresiones regulares

Ahora que hemos cubierto los conceptos básicos y sabe cómo funciona todo, queda por consolidar el conocimiento adquirido sobre las expresiones regulares de linux grep en la práctica. Dos caracteres especiales muy útiles son ^ y $, que indican el principio y el final de una línea. Por ejemplo, queremos que todos los usuarios registrados en nuestro sistema cuyo nombre comience con s. Entonces puedes usar la expresión regular "^s". Puede usar el comando egrep:

egrep "^s" /etc/contraseña

Si queremos seleccionar líneas por el último carácter de la línea, podemos usar $. Por ejemplo, seleccionemos todos los usuarios del sistema, sin shell, los registros sobre dichos usuarios terminan en falso:

egrep "falso$" /etc/contraseña

Para mostrar los nombres de usuario que comienzan con s o d, use esta expresión:

egrep "^" /etc/contraseña

El mismo resultado se puede obtener utilizando el símbolo "|". La primera opción es más adecuada para rangos, y la segunda se usa con más frecuencia para ordinario o / o:

egrep "^" /etc/contraseña

Ahora seleccionemos todos los usuarios cuyo nombre no tenga tres caracteres. El nombre de usuario termina con dos puntos. Podemos decir que puede contener cualquier carácter alfabético, que debe repetirse tres veces, antes de los dos puntos:

egrep "^\w(3):" /etc/contraseña

conclusiones

En este artículo, cubrimos las expresiones regulares de Linux, pero eso fue solo lo básico. Si profundiza un poco más, encontrará que puede hacer cosas mucho más interesantes con esta herramienta. El tiempo dedicado a aprender expresiones regulares definitivamente valdrá la pena.

Al final de la conferencia de Yandex sobre expresiones regulares: