Las expresiones regulares se utilizan para buscar y manipular el texto, según los patrones. La mayoría de los comandos y lenguajes de programación de Linux usan expresiones regulares.
El comando Grep se usa para buscar una cadena específica en un archivo. Consulte nuestro artículo anterior para ver 15 ejemplos prácticos de comandos grep.
También puede usar expresiones regulares con el comando grep cuando desee buscar un texto que contenga un patrón en particular. Las expresiones regulares buscan los patrones en cada línea del archivo. Simplifica nuestra operación de búsqueda.
Este artículo es parte de una serie de 2 artículos.
Este artículo de la parte 1 cubre ejemplos de grep para expresiones regulares simples. El futuro artículo de la parte 2 cubrirá ejemplos avanzados de expresiones regulares en grep.
Tomemos el archivo /var/log/messages que se usará en nuestros ejemplos.
Ejemplo 1. Inicio de línea ( ^ )
En el comando grep, el símbolo de intercalación ^ coincide con la expresión al comienzo de una línea. En el siguiente ejemplo, muestra toda la línea que comienza con el 10 de noviembre. Es decir, todos los mensajes registrados el 10 de noviembre.
$ grep "^Nov 10" messages.1 Nov 10 01:12:55 gs123 ntpd[2241]: time reset +0.177479 s Nov 10 01:17:17 gs123 ntpd[2241]: synchronized to LOCAL(0), stratum 10 Nov 10 01:18:49 gs123 ntpd[2241]: synchronized to 15.1.13.13, stratum 3 Nov 10 13:21:26 gs123 ntpd[2241]: time reset +0.146664 s Nov 10 13:25:46 gs123 ntpd[2241]: synchronized to LOCAL(0), stratum 10 Nov 10 13:26:27 gs123 ntpd[2241]: synchronized to 15.1.13.13, stratum 3
El ^ coincide con la expresión al principio de una línea, solo si es el primer carácter de una expresión regular. ^N coincide con la línea que comienza con N.
Ejemplo 2. Fin de línea ($)
El carácter $ coincide con la expresión al final de una línea. El siguiente comando lo ayudará a obtener todas las líneas que terminan con la palabra "terminando".
$ grep "terminating.$" messages Jul 12 17:01:09 cloneme kernel: Kernel log daemon terminating. Oct 28 06:29:54 cloneme kernel: Kernel log daemon terminating.
A partir de la salida anterior, puede saber cuándo finalizó todo el registro del kernel. Al igual que ^ coincide con el principio de la línea solo si es el primer carácter, $ coincide con el final de la línea solo si es el último carácter de una expresión regular.
Ejemplo 3. Recuento de líneas vacías (^$)
Usando los caracteres ^ y $ puede encontrar las líneas vacías disponibles en un archivo. “^$” especifica una línea vacía.
$ grep -c "^$" messages anaconda.log messages:0 anaconda.log:3
Los comandos anteriores muestran el recuento de líneas vacías disponibles en los mensajes y archivos anaconda.log.
Ejemplo 4. Carácter único (.)
El metacarácter especial “.” (punto) coincide con cualquier carácter excepto el carácter de final de línea. Tomemos el archivo de entrada que tiene el contenido de la siguiente manera.
$ cat input 1. first line 2. hi hello 3. hi zello how are you 4. cello 5. aello 6. eello 7. last line
Ahora busquemos una palabra que tenga un solo carácter seguido de ello. es decir, hola, violonchelo, etc.,
$ grep ".ello" input 2. hi hello 3. hi zello how are you 4. cello 5. aello 6. eello
En caso de que desee buscar una palabra que tenga solo 4 caracteres, puede dar grep -w “….” donde un solo punto representa cualquier carácter único.
Ejemplo 5. Cero o más ocurrencias (*)
El carácter especial "*" coincide con cero o más ocurrencias del carácter anterior. Por ejemplo, el patrón '1*' coincide con cero o más '1'.
El siguiente ejemplo busca un patrón "kernel:*", es decir, kernel:y cero o más ocurrencias del carácter de espacio.
$ grep "kernel: *." * messages.4:Jul 12 17:01:02 cloneme kernel: ACPI: PCI interrupt for device 0000:00:11.0 disabled messages.4:Oct 28 06:29:49 cloneme kernel: ACPI: PM-Timer IO Port: 0x1008 messages.4:Oct 28 06:31:06 btovm871 kernel: sda: sda1 sda2 sda3 messages.4:Oct 28 06:31:06 btovm871 kernel: sd 0:0:0:0: Attached scsi disk sda . .
En el ejemplo anterior, coincide con el kernel y el símbolo de dos puntos seguido de cualquier número de espacios/sin espacio y “.” coincide con cualquier carácter individual.
Ejemplo 6. Una o más ocurrencias (\+)
El carácter especial “\+” coincide con una o más ocurrencias del carácter anterior. ” \+” coincide con al menos uno o más caracteres de espacio.
Si no hay espacio, entonces no coincidirá. El carácter "+" se incluye en la expresión regular extendida. Así que tienes que escapar cuando quieras usarlo con el comando grep.
$ cat input hi hello hi hello how are you hihello $ grep "hi \+hello" input hi hello hi hello how are you
En el ejemplo anterior, el patrón grep coincide con el patrón "hola", seguido de uno o más caracteres de espacio, seguidos de "hola".
Si no hay espacio entre hola y hola, no coincidirá con eso. Sin embargo, el carácter * coincide con cero o más ocurrencias.
"hola" coincidirá con * como se muestra a continuación.
$ grep "hi *hello" input hi hello hi hello how are you hihello $
Ejemplo 7. Cero o una aparición (\?)
El carácter especial “?” coincide con cero o una aparición del carácter anterior. “¿0?” coincide con un solo cero o nada.
$ grep "hi \?hello" input hi hello hihello
“hola \? hola” coincide con hola y hola con espacio simple (hola hola) y sin espacio (hola hola).
La línea que tiene más de un espacio entre hola y hola no coincidió con el comando anterior.
Ejemplo 8. Escapar del carácter especial (\)
Si desea buscar caracteres especiales (por ejemplo:*, punto) en el contenido, debe escapar del carácter especial en la expresión regular.
$ grep "127\.0\.0\.1" /var/log/messages.4 Oct 28 06:31:10 btovm871 ntpd[2241]: Listening on interface lo, 127.0.0.1#123 Enabled
Ejemplo 9. Clase de carácter ([0-9])
La clase de caracteres no es más que una lista de caracteres mencionados entre corchetes que se utilizan para hacer coincidir solo uno de varios caracteres.
$ grep -B 1 "[0123456789]\+ times" /var/log/messages.4 Oct 28 06:38:35 btovm871 init: open(/dev/pts/0): No such file or directory Oct 28 06:38:35 btovm871 last message repeated 2 times Oct 28 06:38:38 btovm871 pcscd: winscard.c:304:SCardConnect() Reader E-Gate 0 0 Not Found Oct 28 06:38:38 btovm871 last message repeated 3 times
Los mensajes repetidos se registrarán en el archivo de registro de mensajes como "último mensaje repetido n veces". El ejemplo anterior busca la línea que tiene cualquier número (0 a 9) seguido de la palabra "veces". Si coincide, muestra la línea anterior a la línea coincidente y también la línea coincidente.
Dentro del corchete, usando un guión puede especificar el rango de caracteres. Como [0123456789] se puede representar por [0-9]. El rango de letras también se puede especificar como [a-z], [A-Z], etc. Por lo tanto, el comando anterior también se puede escribir como
$ grep -B 1 "[0-9]\+ times" /var/log/messages.4
Ejemplo 10. Excepción en la clase de caracteres
Si desea buscar todos los caracteres excepto los que están entre corchetes, utilice el símbolo ^ (signo de intercalación) como el primer carácter después del corchete abierto. El siguiente ejemplo busca una línea que no comienza con la letra de la vocal del archivo de palabras del diccionario en Linux.
$ grep -i "^[^aeiou]" /usr/share/dict/linux.words 1080 10-point 10th 11-point 12-point 16-point 18-point 1st 2
El primer símbolo de intercalación en una expresión regular representa el comienzo de la línea. Sin embargo, el símbolo de intercalación dentro del corchete representa "excepto", es decir, coincide excepto todo lo que está en el corchete.