¡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:
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:
Tubería (|) separa opciones válidas, se podría decir: O lógico. Por ejemplo, "gris|gris" coincide gris o gris.
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.
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. |
* |
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:
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:
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:
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.
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.
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.
$ 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
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.
.*^${}\+?|()
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
$ 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
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
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.
$awk "/.st/(print $0)" miarchivo
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.
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
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.
$ awk "/[^oi]th/(print $0)" miarchivo
EN en este caso Se encontrarán secuencias de caracteres "th" que no estén precedidos por "o" o "i".
$awk "/st/(print $0)" miarchivo
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
Esta expresión regular encontrará todas las secuencias de "st" precedidas por caracteres de rangos a-f y mz.
$ eco "abc" | awk "/[[:alfa:]]/(imprimir $0)" $ echo "abc" | awk "/[[:dígito:]]/(imprimir $0)" $ echo "abc123" | awk "/[[:dígito:]]/(imprimir $0)"
$ eco "prueba" | awk "/tes*t/(imprimir $0)" $ echo "tessst" | awk "/prueba*t/(imprimir $0)"
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
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)"
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.
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.
$ eco "tet" | awk "/tes?t/(imprimir $0)" $ echo "prueba" | awk "/tes?t/(imprimir $0)" $ echo "prueba" | awk "/tes?t/(imprimir $0)"
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)"
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.
$ eco "prueba" | awk "/te+st/(imprimir $0)" $ echo "teest" | awk "/te+st/(imprimir $0)" $ echo "tst" | awk "/te+st/(imprimir $0)"
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)"
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.
$ 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)"
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)"
La plantilla reaccionará al texto si contiene el carácter "a" o el carácter "e" una o dos veces.
$ 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)"
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)"
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".
$ 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.
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.
[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)"
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.
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.
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.
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".
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.
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.
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
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.
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
...
...
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
...
...
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.
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.
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.
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 “|”.
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.
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
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:
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:
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
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.
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
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 "
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 "
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