Ventanas.  Virus.  Portátiles.  Internet.  Oficina.  Utilidades.  Conductores

¡Buenas tardes invitados!

En el artículo de hoy quiero tocar un tema tan amplio como Expresiones regulares. Creo que todo el mundo sabe que el tema de las expresiones regulares (como se llaman las expresiones regulares en la jerga) es muy amplio en el alcance de una publicación. Por lo tanto, intentaré recopilar mis pensamientos de manera breve pero lo más clara posible y transmitírselos en .

Empezaré diciendo que existen varios tipos de expresiones regulares:

1. Expresiones regulares tradicionales(también son básicos, básicos y expresiones regulares básicas(BRE))

  • La sintaxis de estas expresiones se considera obsoleta, pero aún está muy extendida y utilizada por muchas utilidades UNIX.
  • Las expresiones regulares básicas incluyen los siguientes metacaracteres (más información sobre sus significados a continuación):
    • \( \) - versión inicial para ( ) (en extendido)
    • \(\) - versión inicial para () (en extendido)
    • \norte, Dónde norte- número del 1 al 9
  • Características del uso de estos metacaracteres:
    • Un asterisco debe seguir a la expresión correspondiente a un solo carácter. Ejemplo: *.
    • Expresión \( bloquear\)* debe considerarse incorrecto. En algunos casos coincide con cero o más repeticiones de la cadena. bloquear. En otros corresponde a la cadena bloquear* .
    • Dentro de una clase de caracteres, los significados de los caracteres especiales se ignoran en gran medida. Casos especiales:
    • Para agregar un carácter ^ a un conjunto, no debe colocarse primero allí.
    • Para agregar un carácter - a un conjunto, debe colocarse allí primero o último. Por ejemplo:
      • Plantilla de nombre DNS, que puede incluir letras, números, menos y un punto: [-0-9a-zA-Z.] ;
      • cualquier carácter excepto menos y números: [^-0-9] .
    • Para agregar un carácter [o] a un conjunto, primero se debe colocar allí. Por ejemplo:
      • coincide con ], [, a o b.

2. Expresiones regulares avanzadas(ellos son expresiones regulares extendidas(ANTES DE))

  • La sintaxis de estas expresiones es similar a la sintaxis de las expresiones principales, con la excepción de:
    • Se eliminó el uso de barras invertidas para los metacaracteres ( ) y ().
    • Una barra invertida antes de un metacarácter anula su significado especial.
    • Rechazado teóricamente irregular diseño\ norte .
    • Se agregaron metacaracteres + , ? , | .

3. Expresiones regulares compatibles con Perl(ellos son Expresiones regulares compatibles con Perl(PCRE))

  • tienen una sintaxis más rica y al mismo tiempo predecible que incluso POSIX ERE, por lo que las aplicaciones los utilizan a menudo.

Expresiones regulares consiste en plantillas, o mejor dicho establecer una plantilla buscar. La plantilla consta de normas búsquedas, que se componen de caracteres Y metacaracteres.

Reglas de búsqueda están determinados por lo siguiente operaciones:

Enumeración |

Tubería (|) separa opciones válidas, se podría decir: O lógico. Por ejemplo, "gris|gris" coincide gris o gris.

Grupo o unión()

Entre paréntesis se utilizan para definir el alcance y la precedencia de los operadores. Por ejemplo, "gray|grey" y "gr(a|e)y" son patrones diferentes, pero ambos describen un conjunto que contiene gris Y gris.

Cuantificar()? * +

Cuantificador después de que un personaje o grupo determine cuantas veces antecedente puede ocurrir expresión.

expresión general, las repeticiones pueden ser de m a n inclusive.

expresión general m o más repeticiones.

expresión general no más de n repeticiones.

lison repeticiones.

Signo de interrogación medio 0 o 1 veces, igual que {0,1} . Por ejemplo, "color" coincide y color, Y color.

Estrella medio 0, 1 o cualquier número una vez ( {0,} ). Por ejemplo, "go*gle" coincide mover, Google, Google y etc.

Más medio al menos 1 una vez ( {1,} ). Por ejemplo, "go+gle" coincide Google, Google etc. (pero no mover).

La sintaxis exacta de estas expresiones regulares depende de la implementación. (es decir, en expresiones regulares básicas simbolos ( Y )- escapó con una barra invertida)

Metacaracteres dicho en lenguaje sencillo- Son símbolos que no corresponden a su significado real, es decir, un símbolo. (punto) no es un punto, sino un carácter cualquiera, etc. Familiarícese con los metacaracteres y sus significados:

. corresponde solo cualquier símbolo
[algo] Obediente cualquiera carácter distinto de los que están entre paréntesis. En este caso: El carácter “-” se interpreta literalmente sólo si se ubica inmediatamente después de un paréntesis de apertura o antes de un paréntesis de cierre: o [-abc]. De lo contrario, denota un intervalo de caracteres. Por ejemplo, coincide con "a", "b" o "c". Corresponde a letras minúsculas del alfabeto latino. Estas designaciones se pueden combinar: coincide con a, b, c, q, r, s, t, u, v, w, x, y, z. Para hacer coincidir los caracteres "[" o "]", es suficiente que el El corchete de cierre fue el primer carácter después del carácter de apertura: coincide con "]", "[", "a" o "b". Si el valor entre corchetes está precedido por un carácter ^, entonces el valor de la expresión coincide carácter único de entre esos que no están entre paréntesis. Por ejemplo, [^abc] coincide con cualquier carácter que no sea "a", "b" o "c". [^a-z] coincide con cualquier carácter excepto los caracteres en minúscula del alfabeto latino.
^ Coincide con el comienzo del texto (o el comienzo de cualquier línea si el modo es línea por línea).
$ Coincide con el final del texto (o el final de cualquier línea si el modo es línea por línea).
\(\) o () Declara una "subexpresión marcada" (expresión agrupada) que se puede utilizar más adelante (consulte el siguiente elemento: \ norte). Una "subexpresión marcada" también es un "bloque". A diferencia de otros operadores, éste (en la sintaxis tradicional) requiere una barra invertida; en extendido y Perl, el carácter \ no es necesario.
\norte Dónde norte- este es un número del 1 al 9; corresponde norte la subexpresión marcada (por ejemplo (abcd)\0, es decir, los caracteres abcd están marcados con cero). Este diseño es teóricamente irregular, no fue aceptado en la sintaxis de expresión regular extendida.
*
  • Estrella después de una expresión que coincide con un solo carácter, coincide cero o más copias esta expresión (anterior). Por ejemplo, "*" coincide con la cadena vacía, "x", "y", "zx", "zyx", etc.
  • \norte*, Dónde norte es un dígito del 1 al 9, coincide con cero o más apariciones para coincidir norteª subexpresión marcada. Por ejemplo, "\(a.\)c\1*" coincide con "abcab" y "abcaba", pero no con "abcac".

Una expresión encerrada entre "\(" y "\)" seguida de un "*" debe considerarse ilegal. En algunos casos, coincide con cero o más apariciones de la cadena que estaba entre paréntesis. En otros, coincide con la expresión entre paréntesis, dado el carácter "*".

\{X,y\} Corresponde al último ( próximo) bloque que ocurre al menos X y no mas y una vez. Por ejemplo, "a\(3,5\)" coincide con "aaa", "aaaa" o "aaaaa". A diferencia de otros operadores, éste (en sintaxis tradicional) requiere una barra invertida.
.* Designación de cualquier número de caracteres entre dos partes de una expresión regular.

Los metacaracteres nos ayudan a utilizar varias coincidencias. Pero, ¿cómo podemos representar un metacarácter como un carácter regular, es decir, el símbolo [ (corchete) con el significado de corchete? Justo:

  • debe ir precedido ( blindaje) metacarácter (. * + \ ? ( )) barra invertida. Por ejemplo \. o \[

Para simplificar la definición de algunos conjuntos de caracteres, se combinaron en el llamado. clases y categorías de personajes. POSIX ha estandarizado la declaración de ciertas clases y categorías de caracteres, como se muestra en la siguiente tabla:

clase POSIX similarmente designación
[:superior:] letras mayúsculas
[:más bajo:] caracteres en minúscula
[:alfa:] caracteres en mayúsculas y minúsculas
[:alnum:] números, caracteres en mayúsculas y minúsculas
[:dígito:] números
[:xdígito:] dígitos hexadecimales
[:punto:] [.,!?:…] signos de puntuación
[:blanco:] [\t] espacio y TAB
[:espacio:] [\t\n\r\f\v] saltar caracteres
[:control:] personajes de control
[:grafico:] [^\t\n\r\f\v] símbolos de sello
[:imprimir:] [^\t\n\r\f\v] símbolos de sello y símbolos de omisión

En expresiones regulares existe algo como:

expresión regular de codicia

Intentaré describirlo lo más claramente posible. Digamos que queremos encontrarlo todo. etiquetas HTML en algún texto. Habiendo localizado el problema, queremos encontrar los valores contenidos entre< и >, junto con estos mismos corchetes. Pero sabemos que las etiquetas tienen diferentes longitudes y que hay al menos 50 etiquetas. Enumerarlas todas y encerrarlas en metasímbolos es una tarea que consume demasiado tiempo. Pero sabemos que tenemos una expresión.* (punto asterisco), que caracteriza cualquier número de caracteres en la línea. Usando esta expresión intentaremos encontrar en el texto (

Entonces, Como crear Nivel de RAID 10/50 en el controlador LSI MegaRAID (también relevante para: Intel SRCU42x, Intel SRCS16):

) todos los valores entre< и >. Como resultado, TODA la línea coincidirá con esta expresión. por qué, porque la expresión regular es codiciosa e intenta capturar CUALQUIER número de caracteres entre< и >, respectivamente, toda la línea, comenzando < p>Entonces... y terminando ...> pertenecerá a esta regla!

Espero que este ejemplo aclare qué es la codicia. Para deshacerse de esta codicia, puede seguir el siguiente camino:

  • tener en cuenta los símbolos No correspondiente al patrón deseado (por ejemplo:<[^>]*> para el caso anterior)
  • deshazte de la codicia agregando una definición del cuantificador como no codicioso:
    • *? - equivalente "no codicioso" ("perezoso") *
    • +? - equivalente a “no codicioso” (“perezoso”) +
    • (norte,)? - equivalente “no codicioso” (“perezoso”) (n,)
    • .*? - Equivalente a “no codicioso” (“perezoso”).*

Me gustaría agregar a todo lo anterior sintaxis de expresión regular extendida:

Las expresiones regulares en POSIX son similares a la sintaxis tradicional de Unix, pero con la adición de algunos metacaracteres:

Más indica que anterior símbolo o grupo puede repetirse una o más veces. A diferencia del asterisco, se requiere al menos una repetición.

Signo de interrogación hace anterior símbolo o grupo opcional. En otras palabras, en la línea correspondiente puede estar ausente o presente liso uno una vez.

Barra vertical divide opciones alternativas expresiones regulares. Un carácter especifica dos alternativas, pero puede haber más, solo use más barras verticales. Es importante recordar que este operador utiliza la mayor cantidad posible de expresión. Por este motivo, el operador alternativo se utiliza con mayor frecuencia entre paréntesis.

También se ha abolido el uso de barras invertidas: \(...\) se convierte en (...) y \(...\) se convierte en (...).

Para concluir la publicación, daré algunos ejemplos del uso de expresiones regulares:

$ cat texto1 1 manzana 2 pera 3 plátano $ grep p texto1 1 manzana 2 pera $ grep "pp*" texto1 1 manzana 2 pera $ gato texto1 | grep "l\|n" 1 manzana 3 plátano $ echo -e "busca un\n* aquí" | grep "\*" * aquí $ grep "pl\?.*r" text1 # p, en líneas donde hay una r 2 pear $ grep "a.." text1 # líneas con una a seguida de al menos 2 caracteres 1 manzana 3 plátano $ grep "" texto1 # buscar líneas que contengan 3 o p 1 manzana 2 pera 3 plátano $ echo -e "buscar un\n* aquí\nen algún lugar." | grep "[.*]" * aquí en algún lugar..nombre]$ echo -e "123\n456\n789\n0" | grep "" 123,456,789 $ sed -e "/\(a.*a\)\|\(p.*p\)/s/a/A/g" text1 # reemplaza a con A en todas las líneas donde viene después de a a o después de p viene p 1 manzana 2 pera 3 plátano *\./ ÚLTIMA PALABRA./g" Primero. UNA ÚLTIMA PALABRA. Esta es una ÚLTIMA PALABRA.

¡Saludos cordiales, McSim!

Para procesar completamente textos en scripts bash usando sed y awk, solo necesita comprender las expresiones regulares. Implementación de este herramienta más útil se puede encontrar literalmente en todas partes, y aunque todas las expresiones regulares están estructuradas de manera similar, basadas en las mismas ideas, trabajar con ellas en diferentes entornos tiene ciertas características. Aquí hablaremos sobre expresiones regulares que son adecuadas para su uso en scripts de línea de comandos de Linux.

Este material pretende ser una introducción a las expresiones regulares, destinado a aquellos que pueden desconocer por completo lo que son. Así que comencemos desde el principio.

¿Qué son las expresiones regulares?

Muchas personas, cuando ven por primera vez expresiones regulares, inmediatamente piensan que están ante una confusión de caracteres sin sentido. 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 entenderá inmediatamente cómo funciona y por qué es necesario :) Si no lo entiendes del todo, sigue leyendo y todo encajará.
Una expresión regular es un patrón que programas como sed o awk utilizan para filtrar texto. Las plantillas utilizan caracteres ASCII normales que se representan a sí mismos y los llamados metacaracteres que desempeñan un papel especial, por ejemplo, permitiendo hacer referencia a determinados grupos de caracteres.

Tipos de expresiones regulares

Implementaciones de expresiones regulares en diversos entornos, como lenguajes de programación como Java, Perl y Python, en herramientas linux como sed, awk y grep, tienen ciertas características. Estas características dependen de los llamados motores de expresiones regulares, que interpretan 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 cumplen al menos con el estándar POSIX BRE, pero algunas utilidades (incluida sed) comprenden solo un subconjunto del estándar BRE. Una de las razones de esta limitación es el deseo de que dichas utilidades sean lo más rápidas posible en el procesamiento de textos.

El estándar POSIX ERE suele implementarse en lenguajes de programación. Le permite utilizar una gran cantidad de herramientas al desarrollar expresiones regulares. Por ejemplo, podrían ser secuencias especiales de caracteres para patrones utilizados con frecuencia, como la búsqueda de palabras individuales o conjuntos de números en un texto. Awk es compatible con el estándar ERE.

Hay muchas formas de desarrollar expresiones regulares, dependiendo tanto de la opinión del programador como de las características del motor para el que están creadas. No es fácil escribir expresiones regulares universales que cualquier motor pueda entender. Por lo tanto, nos centraremos en las expresiones regulares más utilizadas y veremos las características de su implementación para sed y awk.

Expresiones regulares POSIX BRE

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

$ echo "Esto es una prueba" | sed -n "/test/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 línea. Además, no importa el número de ocurrencias. Después de que la expresión regular encuentra el texto especificado en cualquier parte de la cadena, la cadena se considera adecuada y se pasa para su posterior procesamiento.

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

$ echo "Esto es una prueba" | awk "/Prueba/(print $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ó coincidencias porque la palabra “prueba”, que comienza con mayúscula, no aparece en el texto. El segundo, configurado para buscar una palabra escrita en mayúsculas, encontró una línea adecuada en la secuencia.

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

$ echo "Esta es otra vez la prueba 2" | 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

Cuando se utilizan varios caracteres en expresiones regulares, hay algunas cosas a considerar. Por tanto, existen algunos caracteres especiales, o metacaracteres, cuyo uso en una plantilla requiere un enfoque especial. Aquí están:

.*^${}\+?|()
Si uno de ellos es necesario en la plantilla, será necesario escapar de él mediante 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 del dólar se puede detectar mediante este patrón:

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

Usar un carácter especial en un patrón

Además, la barra invertida también es un carácter especial, por lo que si necesita usarla en un patrón, también será necesario utilizar un carácter de escape. Parecen dos barras una tras otra:

$ echo "\ es un carácter especial" | awk "/\\/(imprimir $0)"

Escapar de una barra invertida

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

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

Uso incorrecto de la barra diagonal en un patrón

Si es necesario, también se debe escapar:

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

Escapar de una barra diagonal

Símbolos de ancla

Hay dos caracteres especiales para vincular un patrón al principio o al final de una cadena de texto. El carácter 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 busca está en algún otro lugar 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)"

Encontrar un patrón al principio de una cuerda

El carácter ^ 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 afecta esto al procesamiento de un archivo de texto:

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


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

Cuando usas sed, si colocas un límite en algún lugar dentro del patrón, será tratado como cualquier otro carácter normal:

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

Tapa no al comienzo del patrón en sed

En awk, cuando se usa la misma plantilla, este carácter debe tener carácter de escape:

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

Cubrir no al principio de la plantilla en awk

Hemos descubierto la búsqueda de fragmentos de texto ubicados al principio de una línea. ¿Qué pasa si necesitas encontrar algo ubicado al final de una línea?

El signo de dólar - $, que es el carácter ancla del 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

Puedes utilizar ambos símbolos de anclaje en la misma plantilla. 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 utiliza caracteres especiales para comenzar y finalizar una línea.

Como puede ver, la plantilla respondió solo a una línea que correspondía completamente a la secuencia de caracteres dada y su ubicación.

A continuación se explica cómo filtrar líneas vacías utilizando caracteres de anclaje:

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

Símbolo de punto

El punto se utiliza para hacer coincidir cualquier carácter excepto el carácter de nueva línea. Pasemos el archivo myfile a esta expresión regular, cuyo contenido se detalla a continuación:

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


Usar un punto en expresiones regulares

Como se puede ver en los datos de salida, sólo las dos primeras líneas del archivo corresponden al 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 El cuarto lo tiene, pero está al principio de la línea.

Clases de personajes

Un punto coincide con cualquier carácter, pero ¿qué sucede si desea ser más flexible al limitar el conjunto de caracteres que está buscando? En esta situación, puedes usar clases de personajes.

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

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


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

Aquí buscamos una secuencia de caracteres "th" precedidos por un carácter "o" o un carácter "i".

Las clases resultan útiles a la hora de buscar palabras que puedan 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 "/esto es una prueba/(imprimir $0)"

Busque palabras que puedan comenzar con una letra minúscula o mayúscula

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

Negación de clases de personajes.

Las clases de caracteres también se pueden utilizar para resolver el problema inverso descrito anteriormente. Es decir, en lugar de buscar símbolos incluidos en una clase, puede organizar una búsqueda de todo lo que no está incluido en la clase. Para lograr este comportamiento de 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


Encontrar personajes que no están en una clase

EN en este caso Se encontrarán secuencias de caracteres "th" que no estén precedidos por "o" o "i".

Rangos de caracteres

En las clases de personajes, puedes describir rangos de caracteres usando guiones:

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


Descripción de una variedad de personajes en una clase de personaje.

EN en este ejemplo La expresión regular responde a una secuencia de caracteres "st" precedidos por cualquier carácter ubicado, en orden alfabético, entre los caracteres "e" y "p".

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

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

expresión regular para buscando tres cualquier numero

Una clase de personaje puede incluir varios rangos:

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


Una clase de personaje que consta de varios rangos.

Esta expresión regular encontrará todas las secuencias de "st" precedidas por caracteres de rangos a-f y mz.

clases de personajes especiales

BRE tiene clases de caracteres especiales que puedes 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 un carácter de tabulación.
  • [[:digit:]] - cualquier carácter de dígito del 0 al 9.
  • [[:upper:]] - caracteres alfabéticos en mayúscula- AZ.
  • [[:lower:]] - caracteres alfabéticos en minúscula - 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, tabulación, caracteres NL, FF, VT, CR.
Puedes usar clases especiales en plantillas como esta:

$ eco "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 estrella

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

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


Usar el carácter * en expresiones regulares

Este comodín se utiliza normalmente para palabras que constantemente se escriben mal o para palabras que están sujetas a diferentes variantes ortografía correcta:

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

Encontrar una palabra con diferente ortografía

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

Otra característica útil que proviene del símbolo de 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


Una 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:

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


Usar un asterisco con clases de personajes

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 encuentra ninguno, la cadena coincidirá con el patrón dado.

Expresiones regulares POSIX ERE

Plantillas POSIX ERE que admiten algunas Utilidades de Linux, puede contener caracteres adicionales. Como ya se mencionó, awk admite este estándar, pero sed no.

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

▍Signo de interrogación

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

$ eco "tet" | awk "/tes?t/(imprimir $0)" $ echo "prueba" | awk "/tes?t/(imprimir $0)" $ echo "prueba" | awk "/tes?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 “testst”.

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

$ eco "tst" | awk "/t?st/(imprimir $0)" $ echo "prueba" | awk "/t?st/(imprimir $0)" $ echo "tast" | awk "/t?st/(print $0)" $ echo "taest" | awk "/t?st/(print $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 línea, 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 carácter más en el patrón indica que la expresión regular coincidirá con lo que busca si el carácter anterior aparece una o más veces en el texto. Sin embargo, esta construcción no reaccionará ante la ausencia de un símbolo:

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


El símbolo más en expresiones regulares

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

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


Clases de signos y caracteres más

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

▍Tirantes rizados

Las llaves, que se pueden usar en patrones ERE, son similares a los símbolos discutidos anteriormente, pero le permiten especificar con mayor precisión la cantidad requerida de apariciones del símbolo que las precede. Puede especificar una restricción en dos formatos:
  • n: un número que especifica el número exacto de apariciones buscadas
  • n, m son dos números que se interpretan de la siguiente manera: “al menos n veces, pero no más de m”.
A continuación se muestran ejemplos de la primera opción:

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

Llaves en patrones, buscando el número exacto de apariciones

En versiones anteriores de awk tenías que usar la opción de línea de comando --re-interval para que el programa reconociera intervalos en expresiones regulares, pero en versiones más nuevas esto no es necesario.

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


Espaciado especificado entre llaves

En este ejemplo, el carácter “e” debe aparecer 1 o 2 veces en la línea, luego la expresión regular responderá al texto.

Las llaves también se pueden utilizar con clases de caracteres. Los principios que ya conoce se aplican aquí:

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


Llaves y clases de caracteres.

La plantilla reaccionará al texto si contiene el carácter "a" o el carácter "e" una o dos veces.

▍Símbolo lógico “o”

Símbolo | - una barra vertical significa una “o” lógica en expresiones regulares. Al procesar una expresión regular que contiene varios fragmentos separados por dicho signo, el motor considerará adecuado el texto analizado si coincide con alguno de los fragmentos. He aquí un ejemplo:

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


"o" lógico en expresiones regulares

En este ejemplo, la expresión regular está configurada para buscar en el texto las palabras "prueba" o "examen". Tenga en cuenta que entre los fragmentos de la 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:

$ eco "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 un signo de interrogación significa "0 o 1 repetición", por lo que la expresión regular responderá tanto a la cadena "Me gusta" como a 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.

▍Contando el número de archivos

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

$ eco $RUTA | sed "s/:/ /g"
El comando reemplazar admite expresiones regulares como patrones para buscar texto. En este caso, todo es extremadamente simple, buscamos el símbolo de dos puntos, pero nadie nos molesta en usar algo más aquí, todo depende de la tarea específica.
Ahora debe recorrer la lista resultante en un bucle y realizar las acciones necesarias para contar la cantidad de archivos. Esquema general el script será así:

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

#!/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=$ [ $cuenta + 1 ] hecho echo "$directorio - $cuenta" cuenta=0 hecho
Al ejecutar el script, puede resultar que algunos directorios de PATH no existan; sin embargo, esto no impedirá que cuente los archivos en los directorios existentes.


conteo de archivos

El principal valor de este ejemplo es que utilizando el mismo enfoque se pueden resolver problemas mucho más complejos. Cuáles dependen exactamente de sus necesidades.

▍Verificar direcciones de correo electrónico

Hay sitios web con enormes colecciones de expresiones regulares que te permiten comprobar direcciones. Correo electrónico, números de teléfono, etcétera. Sin embargo, una cosa es tomar algo ya hecho y otra muy distinta es crear algo usted mismo. Entonces, escribamos una expresión regular para verificar las direcciones de correo electrónico. Comencemos analizando los datos de origen. Aquí, por ejemplo, hay una dirección determinada:

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

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

^(+)@
Esta expresión regular se puede leer de la siguiente manera: "La línea debe comenzar con al menos un carácter de los del grupo especificado entre corchetes, seguido de un signo @".

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

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

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

Habiendo preparado plantillas para partes individuales de la expresión regular, unámoslas:

^(+)@(+)\.({2,5})$
Ahora sólo queda comprobar qué pasó:

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


Validar una dirección de correo electrónico usando 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 comprobar direcciones de correo electrónico que encontró al principio del artículo le parecía completamente incomprensible entonces, 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 la vida, pero incluso lo poco que hemos cubierto ya puede ayudarte a escribir scripts que procesen textos bastante avanzados.

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

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

Uno de los equipos más útiles y ricos en funciones de terminal linux– Comando “grep”. Grep es un acrónimo que significa "impresión global de expresiones regulares" (es decir, "busque en todas partes cadenas que coincidan con una expresión regular e imprímalas"). Esto significa que grep se puede utilizar para ver si la entrada coincide con patrones específicos.

Este programa aparentemente trivial es muy poderoso cuando se usa correctamente. Su capacidad para ordenar entradas basándose en reglas complejas lo convierte en un vínculo popular en muchas cadenas de comando.

Este tutorial analiza algunas de las capacidades 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 utiliza para encontrar coincidencias de patrones de letras en Archivo de texto. Esto significa que si a grep se le proporciona una palabra de búsqueda, imprimirá cada línea del archivo que contenga esa palabra.

Como ejemplo, puede utilizar grep para buscar líneas que contengan la palabra "GNU" en la versión 3 de la Licencia Pública General 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 la Licencia Pública General GNU Affero en un solo
...
...

El primer argumento, "GNU", es el patrón a buscar y el segundo argumento, "GPL-3", es el archivo de entrada que se va a encontrar.

Como resultado, se generarán todas las líneas que contengan el patrón de texto. En algunos Distribuciones de Linux El patrón que está buscando se resaltará en las líneas de salida.

Opciones generales

De forma predeterminada, el comando grep simplemente busca patrones estrictamente especificados en el archivo de entrada e imprime las líneas que encuentra. Sin embargo, el comportamiento de grep se puede cambiar agregando algunas opciones adicionales.

Si necesita ignorar el caso 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".

Como ejemplo, puede utilizar grep para buscar en el mismo archivo la palabra "licencia" escrita 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 y 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 tiene como objetivo garantizar su libertad para
Licencia pública general GNU para la mayor parte de nuestro software; se aplica también 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 licencia bajo este
...
...

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

Como ejemplo, podría 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 específico por escrito.
ESTE SOFTWARE ES PROPORCIONADO POR LOS REGENTES Y COLABORADORES "TAL CUAL"" Y
CUALQUIER GARANTÍA EXPRESA O IMPLÍCITA, INCLUYENDO, PERO NO LIMITADO A, LA
...
...

Como puede ver, las dos últimas líneas se generaron como si no contuvieran la palabra "el" porque no se utilizó el comando "ignorar mayúsculas y minúsculas".

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

Si aplica esta bandera 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 permiso previo específico por escrito.
15:
16: ESTE SOFTWARE ES PROPORCIONADO POR LOS REGENTES Y COLABORADORES ``TAL CUAL"" ​​Y
17: CUALQUIER GARANTÍA EXPRESA O IMPLÍCITA, INCLUYENDO, PERO NO LIMITADO A, LA
...
...

Ahora puede consultar el número de línea cuando necesite 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.

Las diferentes aplicaciones y lenguajes de programación utilizan expresiones regulares de forma ligeramente diferente. Este tutorial cubre sólo un pequeño subconjunto de formas de describir patrones para Grep.

Coincidencias de letras

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

Es más correcto pensar en ellas como coincidencias de cadenas de caracteres que como coincidencias de palabras. Una vez que se familiarice con patrones más complejos, esta distinción será más significativa.

Los patrones que coinciden exactamente con determinados caracteres se denominan patrones de "letras" porque coinciden con el patrón letra por letra, carácter por carácter.

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

Partidos ancla

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

Por ejemplo, puede especificar que la búsqueda solo necesite líneas que contengan la palabra "GNU" al principio. Para hacer esto, debe usar el ancla "^" antes de la cadena de letras.

Este ejemplo sólo imprime 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; se aplica también a
Licencia Pública General GNU, puede elegir cualquier versión jamás publicada

Del mismo modo, el ancla "$" se puede utilizar después de una cadena literal para indicar que la coincidencia es válida sólo si la cadena de caracteres que se busca está al final de la cadena de texto.

La siguiente expresión regular imprime sólo aquellas líneas que contienen "y" al final:

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


La alternativa se permite sólo ocasionalmente y sin fines comerciales, y
red podrá ser denegada cuando la modificación en sí sea material y
afecta negativamente 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 a la venta, importar y de otro modo ejecutar, modificar y

Combina cualquier personaje

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

Por ejemplo, si desea buscar coincidencias que contengan dos caracteres y luego la secuencia "cept", utilizaría el siguiente patrón:

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

forma de licencia escrita por separado, o indicadas como excepciones;
No puede propagar ni modificar una obra cubierta excepto en la forma expresa
9. No se requiere aceptación para tener copias.
...
...

Como puede ver, los resultados incluyen las palabras "aceptar" y "excepto", así como variaciones de estas palabras. El patrón también coincidiría con la secuencia “z2cept” si estuviera 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 aparecer en esa posición.

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

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

Los desarrolladores que utilizan GNU GPL protegen sus derechos con dos pasos:
una red informática, sin transferencia de copia, no es transmisión.

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

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

Poner caracteres entre paréntesis también proporciona varias funciones útiles. Puede indicar que todo, excepto los caracteres entre paréntesis, coincide con el patrón comenzando la lista de caracteres entre paréntesis con el carácter “^”.

Este ejemplo utiliza el patrón ".ode", que no debe coincidir con la secuencia "código".

grep "[^código]odo" GPL-3
1. Código fuente.
modelo, para darle a cualquiera que posea el código objeto (1) un
el único modo significativo de uso del producto.
Observe así cuando comienza en modo interactivo:

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

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

Otra característica útil de los paréntesis es la capacidad de especificar un rango de caracteres en lugar de tener que escribir cada carácter individualmente.

Esto significa que si necesitas encontrar cada línea que comienza con una letra mayúscula, puedes usar el siguiente patrón:

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

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


Bibliotecas del sistema, o herramientas de uso general o generalmente disponibles de forma gratuita
Fuente.

...
...

Debido a algunos problemas de intercalación inherentes, para obtener resultados más precisos es mejor utilizar clases de caracteres POSIX en lugar del rango de caracteres utilizado en el ejemplo anterior.
Hay muchas clases de personajes que no se tratan en este manual; por ejemplo, para realizar el mismo procedimiento que en el ejemplo anterior, puede utilizar la clase de carácter "[:upper:]" entre paréntesis.

grep "^[[:superior:]]" GPL-3
Licencia pública general GNU para la mayor parte de nuestro software; se aplica también a
Los Estados no deberían permitir que las patentes restrinjan el desarrollo y uso de
Licencia. A cada licenciatario se le llama "usted". "Licencias" y
componente, y (b) sirve únicamente para permitir el uso del trabajo con ese
Componente principal, o para implementar una interfaz estándar para la cual
Bibliotecas del sistema, o herramientas de uso general o generalmente disponibles de forma gratuita
Fuente.
El Producto del 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 símbolo "*", que significa "repetir el carácter o expresión anterior 0 o más veces".

Por ejemplo, si desea encontrar cada línea 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) esté incluida en la forma normal de
componente, y (b) sirve únicamente 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 del
(incluido un medio de distribución física), acompañado de un
lugar (gratis o de pago) y ofrecer acceso equivalente a la
...
...

Cómo evitar los metacaracteres

A veces es posible que necesites buscar un punto literal o un paréntesis abierto literal. Dado que estos símbolos tienen valor específico en expresiones regulares, es necesario "escapar" de ellas diciéndole a grep que su significado especial no es necesario en este caso.

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

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

grep "^.*\.$" GPL-3
Fuente.
Licencia haciendo excepciones a una o más de sus condiciones.
Licencia sería abstenerse por completo de transmitir el Programa.
TODOS LOS SERVICIOS, REPARACIONES O CORRECCIÓN NECESARIOS.
TALES DAÑOS.
También agregue información sobre cómo contactarlo por correo electrónico y en papel.

Expresiones regulares avanzadas

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

Estos comandos abren las capacidades de las "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 que brindan las expresiones regulares extendidas es la capacidad de agrupar expresiones y usarlas como una sola unidad.

Los paréntesis se utilizan para agrupar expresiones. Si necesita usar paréntesis fuera de expresiones regulares extendidas, puede "escaparlos" usando 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, el intercalado le permite especificar coincidencias alternativas para cadenas de caracteres o conjuntos de expresiones.

El símbolo de barra vertical “|” se utiliza para indicar alternancia. La alternancia se utiliza a menudo en agrupaciones para indicar que uno de dos o más opciones posibles debe considerarse una coincidencia.

En este ejemplo, debe buscar "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 y copyleft para
La Licencia Pública General GNU tiene como objetivo garantizar su libertad para
Licencia pública general GNU para la mayor parte de nuestro software; se aplica también a
precio. Nuestras Licencias Públicas Generales están diseñadas para garantizar que usted
Los desarrolladores que utilizan GNU GPL protegen sus derechos con dos pasos:
Para la protección de los desarrolladores y autores, la GPL explica claramente
Por el bien de los autores, la GPL exige que las versiones modificadas se marquen como
Hemos diseñado esta versión de la GPL para prohibir la práctica a aquellos
...
...

La alternancia se puede utilizar para elegir entre dos o más opciones; Para ello es necesario introducir el resto de opciones en el grupo de selección, separando cada una mediante el símbolo de barra vertical “|”.

Cuantificadores

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

Para hacer coincidir un carácter 0 o más veces, puede utilizar el carácter "?". Hará que el personaje o serie de personajes anterior sea esencialmente opcional.

En este ejemplo, al insertar la secuencia "copiar" en el grupo opcional, se muestran las coincidencias "copyright" y "right":

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

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

La siguiente expresión coincide con la cadena "libre" 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 y copyleft para
para quitarte la libertad de compartir y cambiar las obras. Por el contrario,
La Licencia Pública General GNU tiene como objetivo garantizar su libertad para
Cuando hablamos de software libre nos referimos a libertad, no
tener la libertad de distribuir copias de software libre (y cobrar por

libertades que recibiste. Debes asegurarte de que ellos también reciban
proteger la libertad de los usuarios para cambiar el software.
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 partidos repetidos

Si necesita especificar el número de veces que se deben repetir las coincidencias, puede utilizar llaves (“( )”). Estos símbolos se utilizan para indicar el número exacto, el rango y los límites superior e inferior del número de coincidencias de una expresión.

Si necesita encontrar todas las líneas que contienen una combinación de tres vocales, puede utilizar la siguiente expresión:

grep -E "(3)" GPL-3
cambiado, para que sus problemas no se atribuyan erróneamente a
autores de versiones anteriores.
recibirlo, en cualquier medio, siempre que usted de manera visible y
dar conforme al 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 constan de 16 a 20 caracteres, utilice 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 archivos o en una jerarquía. sistema de archivos. Ahorra mucho tiempo, por lo que vale la pena familiarizarse con sus parámetros y sintaxis.

Las expresiones regulares son aún más versátiles y pueden usarse en muchos programas populares. Por ejemplo, muchos editores de texto Utilice 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. Saber trabajar con expresiones regulares resulta útil a la hora de resolver problemas comunes relacionados con la informática.

Etiquetas: ,

Las expresiones regulares son una herramienta muy poderosa para buscar texto por patrón, procesar y modificar cadenas, que pueden usarse para resolver muchos problemas. Aquí están los principales:

  • Verificación de entrada de texto;
  • Buscar y reemplazar texto en un archivo;
  • Cambio de nombre de archivos por lotes;
  • Interacción con servicios como Apache;
  • Comprobando que una cadena coincida con 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 forman usando lenguaje especial. Pero dadas las capacidades proporcionadas, todos deberían conocer y poder utilizar las expresiones regulares de Linux. Administrador de sistema.

En este artículo, veremos las expresiones regulares de bash para principiantes para que puedas comprender todas las características de esta herramienta.

Hay dos tipos de caracteres que se pueden utilizar en expresiones regulares:

  • cartas ordinarias;
  • metacaracteres.

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

Los metacaracteres son otra cosa; son los que dan su poder a las expresiones regulares. Con los metacaracteres puedes hacer mucho más que simplemente buscar un solo carácter. Puede buscar combinaciones de símbolos, utilizar una cantidad dinámica de símbolos y seleccionar rangos. Todos los caracteres especiales se pueden dividir en dos tipos: caracteres de reemplazo, que reemplazan a los caracteres normales, u operadores, que indican cuántas veces se puede repetir un carácter. La sintaxis de la expresión regular sería así:

carácter_regular operador_carácter especial

personaje_reemplazo_especial operador_carácter especial

  • — los caracteres especiales alfabéticos comienzan con una barra invertida, y también se utiliza si es necesario utilizar 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 una o más veces;
  • ? — el carácter anterior puede aparecer cero o una vez;
  • (norte)— indica cuántas veces (n) se debe repetir el carácter anterior;
  • (N,n)— el carácter anterior se puede repetir de N a n veces;
  • . — cualquier carácter excepto el 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 carácter del rango especificado;
  • [^az]— cualquier carácter que no esté dentro del rango;
  • b— denota el límite de una 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 símbolo es un número;
  • D— carácter no numérico;
  • norte— carácter de avance de línea;
  • s- uno de los caracteres de espacio, espacio, tabulación, etc.;
  • S— cualquier carácter excepto el 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 Unicdoe.

Es importante tener en cuenta que debe utilizar una barra diagonal antes de los caracteres especiales alfabéticos para indicar que a continuación viene un carácter especial. Lo contrario también es cierto: si desea utilizar un carácter especial que se utiliza sin barra como carácter normal, deberá agregar una barra.

Por ejemplo, desea encontrar la línea 1+ 2=3 en el texto. Si usas esta cadena como expresión regular no encontrarás nada, porque el sistema interpreta el signo más como un carácter especial que indica que la unidad anterior debe repetirse una o más veces. Por lo tanto, es necesario escapar: 1 + 2 = 3. Sin escapar, nuestra expresión regular solo coincidiría con la cadena 11=3 o 111=3 y así sucesivamente. No es necesario poner una línea delante de igual, porque no es un carácter especial.

Ejemplos de uso de expresiones regulares

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

egrep "^s" /etc/contraseña

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

egrep "falso$" /etc/contraseña

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

egrep "^" /etc/contraseña

Se puede obtener el mismo resultado utilizando el símbolo "|". La primera opción es más adecuada para rangos, y la segunda se usa más a menudo para regular y/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, el cual 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 sólo lo básico. Si profundiza un poco más, encontrará que puede hacer cosas mucho más interesantes con esta herramienta. Definitivamente valdrá la pena tomarse el tiempo para dominar las expresiones regulares.

Para concluir, una conferencia de Yandex sobre expresiones regulares:

La utilidad grep es una herramienta muy poderosa para buscar y filtrar información de texto. Este artículo muestra varios ejemplos de su uso que le permitirán apreciar sus capacidades.
El uso principal de grep es buscar palabras o frases en archivos y flujos de salida. Puedes buscar escribiendo línea de comandoÁrea de consulta y búsqueda (archivo).
Por ejemplo, para encontrar la cadena "aguja" en el archivo hystack.txt, use el siguiente comando:

$ grep aguja pajar.txt

Como resultado, grep mostrará todas las apariciones de aguja que encuentre en el contenido del archivo haystack.txt. Es importante tener en cuenta que en este caso, grep busca un conjunto de caracteres, no una palabra. Por ejemplo, se mostrarán cadenas que incluyan la palabra "needless" y otras palabras que contengan la secuencia "needle".


Para decirle a grep que está buscando una palabra específica, use el modificador -w. Esta clave limitará la búsqueda solo a la palabra especificada. Una palabra es una consulta delimitada en ambos lados por espacios en blanco, puntuación o saltos de línea.

$ grep -w aguja pajar.txt

No es necesario limitar la búsqueda a un solo archivo; grep puede buscar en un grupo de archivos y los resultados de la búsqueda indicarán el archivo en el que se encontró la coincidencia. El modificador -n también agregará el número de línea en la que se encontró la coincidencia, y el modificador -r le permitirá ejecutar búsqueda recursiva. Esto es muy conveniente al buscar entre archivos con códigos fuente de programas.

$ grep -rnw nombre_función /home/www/dev/myprogram/

El nombre del archivo aparecerá antes de cada partido. Si necesita ocultar nombres de archivos, use el modificador -h; por el contrario, si solo necesita nombres de archivos, especifique el modificador -l
En el siguiente ejemplo, buscaremos URL en el archivo de registro de IRC y mostraremos las últimas 10 coincidencias.

$ grep -wo http://.* canal.log | cola

La opción -o le dice a grep que imprima solo la coincidencia del patrón en lugar de toda la línea. Usando pipe, redirigimos la salida de grep al comando tail, que de forma predeterminada genera las últimas 10 líneas.
Ahora contaremos la cantidad de mensajes enviados al canal irc por ciertos usuarios. Por ejemplo, todos los mensajes que envié desde casa y el trabajo. Se diferencian en el apodo, en casa uso el apodo user_at_home y en el trabajo user_at_work.

$ grep -c "^usuario_en_(casa|trabajo)" canal.log

Con la opción -c, grep solo imprime el número de coincidencias encontradas, no las coincidencias en sí. La cadena de búsqueda está entre comillas porque contiene caracteres especiales que el shell puede reconocer como caracteres de control. Tenga en cuenta que las comillas no están incluidas en el patrón de búsqueda. La barra invertida "" se utiliza para escapar de caracteres especiales.
Busquemos mensajes de personas a las que les guste “gritar” en el canal. Por “grito” nos referimos a mensajes escritos al estilo blondy, algunos EN LETRAS MAYÚSCULAS. Para excluir accesos aleatorios de abreviaturas de la búsqueda, buscaremos palabras de cinco o más caracteres:

$ grep -w "+(5,)" canal.log

Para obtener una descripción más detallada, puede consultar la página de manual de grep.
Algunos ejemplos más:

# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash operador:x:11:0:operator:/root:/sbin/nologin

Muestra líneas del archivo /etc/passwd que contienen la cadena raíz.

# grep -n root /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 12:operator:x:11:0:operator:/root:/sbin/nologin

Además, se muestran los números de línea que contienen la línea buscada.

# grep -v bash /etc/passwd | grep -v nologin sync:x:5:0:sync:/sbin:/bin/sync apagado:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin :/sbin/halt news:x:9:13:news:/var/spool/news: mailnull:x:47:47::/var/spool/mqueue:/dev/null xfs:x:43:43: Servidor de fuentes X:/etc/X11/fs:/bin/false rpc:x:32:32:Portmapper Usuario RPC:/:/bin/false nscd:x:28:28:NSCD Daemon:/:/bin/false Named:x:25:25:Named:/var/named:/bin/false squid:x:23:23::/var/spool/squid:/dev/null ldap:x:55:55:Usuario LDAP: /var/lib/ldap:/bin/false apache:x:48:48:Apache:/var/www:/bin/false

Comprueba qué usuarios no están usando bash, excluyendo aquellas cuentas de usuario que tienen nologin especificado como su shell.

# grep -c falso /etc/contraseña 7

Cuenta la cantidad de cuentas que tienen /bin/false como shell.

# grep -i juegos ~/.bash* | grep -v historial

Este comando muestra líneas de todos los archivos en el directorio de inicio del usuario actual cuyos nombres comienzan con ~/.bash, excluyendo aquellos archivos cuyos nombres incluyen el historial de cadenas, para excluir coincidencias encontradas en ~/.bash_history en las que se puede especificar la misma cadena. en mayúsculas o minúsculas. Tenga en cuenta que la búsqueda de la palabra "juegos" se realiza, puede sustituirla por cualquier otra palabra.
comando grep y expresiones regulares

A diferencia del ejemplo anterior, ahora mostraremos sólo aquellas líneas que comiencen con la línea “raíz”:

# grep ^root /etc/passwd root:x:0:0:root:/root:/bin/bash

Si queremos ver qué cuentas no han usado el shell en absoluto, buscamos líneas que terminen con el carácter ":":

# grep:$ /etc/passwd noticias:x:9:13:noticias:/var/spool/noticias:

Para verificar si la variable PATH en su archivo ~/.bashrc está exportada, primero seleccione las líneas con "exportar" y luego busque líneas que comiencen con la línea "PATH"; en este caso, MANPATH y otros no se mostrarán formas posibles:

# grep exportar ~/.bashrc | grep "RUTA" export RUTA="/bin:/usr/lib/mh:/lib:/usr/bin:/usr/local/bin:/usr/ucb:/usr/dbin:$RUTA"

Clases de personajes

La expresión entre corchetes es una lista de caracteres encerrados entre los caracteres [" y "]"". Coincide con cualquier carácter especificado en esta lista; si el primer carácter de la lista es "^", entonces coincide con cualquier carácter que NO esté en la lista. Por ejemplo, la expresión regular "" coincide con cualquier dígito.

Dentro de una expresión entre corchetes, puede especificar un rango que consta de dos caracteres separados por un guión. Luego, la expresión coincide con cualquier singleton que, según las reglas de clasificación, se encuentre dentro de estos dos caracteres, incluidos estos dos caracteres; esto tiene en cuenta la intercalación y el juego de caracteres especificados en la configuración regional. Por ejemplo, cuando la configuración regional predeterminada es C, la expresión "" equivale a la expresión "". Hay muchas configuraciones regionales en las que la clasificación se realiza según el orden del diccionario, y en estas configuraciones regionales "" generalmente no es equivalente a "", en las que, por ejemplo, puede ser equivalente a la expresión "". Para utilizar la interpretación tradicional de la expresión especificada entre corchetes, puede utilizar la configuración regional C configurándola en Variable ambiental LC_ALL valor "C".

Finalmente, hay clases de caracteres con nombres especiales, que se especifican dentro de expresiones entre corchetes. Información adicional Para obtener información sobre estas expresiones predefinidas, consulte las páginas de manual o la documentación del comando grep.

# grep /etc/group sys:x:3:root,bin,adm tty:x:5: mail:x:12:mail,postfix ftp:x:50: nadie:x:99: disquete:x:19: xfs:x:43: nfsnobody:x:65534: postfix:x:89:

El ejemplo muestra todas las líneas que contienen el carácter "y" o el carácter "f".
Personajes universales (metacaracteres)

Usar "." para que coincida con cualquier carácter. Si desea una lista de todas las palabras en inglés tomadas del diccionario que contienen cinco caracteres que comienzan con "c" y terminan con "h" (útil para resolver crucigramas):

#grep " " /usr/share/dict/palabras atrapan choque tela entrenador sofá tos choque aplastar

Si desea mostrar líneas que contienen un carácter de punto como literal, especifique la opción -F en el comando grep. Símbolos "< " и «>" significa la presencia de una línea vacía antes y, en consecuencia, después de las letras especificadas. Esto significa que las palabras del archivo de palabras deben escribirse en consecuencia. Si desea encontrar todas las palabras del texto según los patrones especificados sin tener en cuenta lineas vacias omitir los "caracteres< " и «>", para una búsqueda más precisa de solo palabras, utilice el modificador -w.

Para buscar de manera similar palabras que puedan tener cualquier número de caracteres entre la "c" y la "h", utilice un asterisco (*). El siguiente ejemplo selecciona todas las palabras que comienzan con "c" y terminan con "h" del diccionario del sistema:

#grep " " /usr/share/dict/words caliph cash catch cheetah --salida omitida--

Si desea encontrar el carácter de asterisco literal en un archivo o flujo de salida, utilice comillas simples para encontrarlo. El usuario en el siguiente ejemplo primero intenta buscar un "asterisco" en el archivo /etc/profile sin usar comillas, lo que resulta en que no se encuentra nada. Cuando se utilizan comillas, el resultado es:

# grep * /etc/profile # grep "*" /etc/profile para i en /etc/profile.d/*.sh; hacer

Si nota un error, seleccione un fragmento de texto y presione Ctrl+Enter
COMPARTIR: