Uso del comando grep en Linux
Table of Contents
ToggleIntroducción
El uso del comando grep en Linux es uno de los mas utilizados en sistemas GNU/Linux ya que se utiliza para buscar patrones en archivos o por STDIN en cualquier entorno. Especialmente por buscar textos a través de expresiones regulares. Aconsejamos haber leído las herramientas anteriormente vistas para un mejor uso.
Sintaxis:
grep (opciones) [patrón] archivo
Opciones:
-i No diferencia mayúsculas de minúsculas.
-c Cuenta la cantidad de coincidencias.
-v Muestra el resultado inverso.
-E Utiliza expresiones regulares extendidas.
-r Búsqueda recursiva.
-n Muestra el número de línea.
–A [numero] Muestra “número” de líneas después del patrón encontrado.
-B [numero] Muestra “número” de líneas antes del patrón encontrado.
Contar la cantidad de coincidencias de la palabra error en el siguiente archivo:
# grep -c error /var/log/messages
Buscar la palabra error y remarcarla con color:
# grep –color error /var/log/messages
Contar la cantidad de coincidencias de la palabra error en todos los archivos que comienzan con a:
# grep -c error /var/log/a*
/var/log/agns:0
/var/log/anaconda.log:1
/var/log/anaconda.program.log:0
/var/log/anaconda.storage.log:0
/var/log/anaconda.syslog:6
Contar la cantidad de coincidencias de la palabra error sin distinguir mayúsculas de minúsculas:
# grep -c error /var/log/messages
5
Opciones con pipes
Muestra sólo lo que contenga la palabra root:
# cat /etc/passwd | grep root
root:x:0:0:root:/root:/bin/bash
Muestra lo que no contenga la palabra bash:
# cat /etc/passwd|grep -v bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
Busca la palabra link y muestra el número de línea:
# grep -n link /var/log/messages
Busca la palabra error en el directorio /var/log y todos sus subdirectorios:
# grep -rn error /var/log/*
Busca la palabra DHCPACK y muestra una línea antes y una después del resultado:
# grep -A 1 -B 1 DHCPACK /var/log/messages
Sep 30 17:50:08 oc6127656113 dhclient[2991]: DHCPREQUEST on em1 to 9.0.132.30 port 67
Sep 30 23:58:08 oc6127656113 dhclient[2991]: DHCPACK from 9.0.132.30
Ejemplos:
La contrabarra “ \ ” es un caracter de “escape”, esto significa que el caracter que este a continuación del mismo, tendrá un significado en especial.
Expresiones Regulares
Como mencionamos anteriormente, el uso del comando grep en linux se hace más «poderoso» a través de las expresiones regulares. En ellas utilizamos cadenas de texto o patrones, los cuales pueden ser de dos tipos literales (texto plano) o metacaracteres (símbolos con un significado especial).
Veamos algunos símbolos:
^ Indica que es al inicio de la línea.
$ Al final de la línea.
\< \> Exactamente lo que está entre \< \> (Ej: \<palabra\>)
Buscar el patrón bin dentro del archivo /etc/passwd:
# grep ‘bin’ /etc/passwd
root:x:0:0:root:/root:/ bin /bash
daemon:x:1:1:daemon:/usr/s bin :/ bin /sh
bin :x:2:2: bin :/ bin :/ bin /sh
(…)
Buscar la línea que comienza con bin:
# grep ‘^bin’ /etc/passwd
bin:x:2:2:bin:/bin:/bin/sh
Buscar exactamente bin:
# grep ‘\<bin\>’ /etc/passwd
root:x:0:0:root:/root:/ bin /bash
daemon:x:1:1:daemon:/usr/sbin:/ bin /sh
bin :x:2:2:bin:/ bin :/ bin /sh
Buscar lo que finaliza con sh:
# grep ‘sh$’ /etc/passwd
root:x:0:0:root:/root:/bin/ba sh
daemon:x:1:1:daemon:/usr/sbin:/bin/ sh
bin:x:2:2:bin:/bin:/bin/ sh
Mostrar todas las líneas NO vacías:
# grep -v ‘^$’ archivo.txt
Character sets:
[abc] Grupo de caracteres. Esto identifica una de esas tres letras.
[a-z] Identifica cualquier letra de la a a la z en minúscula.
[0-9] Identifica cualquier número.
[^abc] Identifica cualquier letra que no sea a, b, c en minúscula.
[^a-z] Identifica cualquier caracter que no sea de la a a la z minúscula.
El signo “ . ” es un comodín para cualquier caracter (excepto línea nueva).
También podemos usar:
\d Hace referencia a [0-9]
\D Hace referencia a [^0-9]
\t tabulación
\T NO tabulación
\s espacio en blanco
\S NO espacio en blanco
\n salto en línea
\r retorno de carro
\b separador de palabra
POSIX character clases
[:alnum:] Alphanumeric [a-zA-Z0-9]
[:alpha:] Alphabetic [a-zA-Z]
[:blank:] Spaces or Tabs
[:cntrl:] Control characters
[:digit:] Numeric digits [0-9]
[:graph:] Any visible characters
[:lower:] Lowercase [a-z]
[:print:] Noncontrol characters
[:punct:] Punctuation characters
[:space:] Whitespace
[:upper:] Uppercase [A-Z]
[:xdigit:] Hex digits [0-9a-fA-F]
Ejemplos:
Los caracteres pueden ser situados en grupos y rangos para realizar expresiones regulares más efecientes.
# cat ejemplo.txt
Villa Dalmine
Restaurador de Leyes de Argentina
JMR
Argelia
argelia
124Argelia
12JMR
12345JMR
Buscar Argelia o argentina:
# grep ‘[Aa]rgelia’ ejemplo.txt
argelia
124Argelia
Buscar exactamente Argentina o argentina:
# grep ‘\<[Aa]rgentina\>’ ejemplo.txt
Restaurador de Leyes de Argentina
Buscar tres números consecutivos del 0 al 9:
# grep ‘[0-9][0-9][0-9]‘ ejemplo.txt
124Argelia
12345JMR
Buscar todo lo que no comience con un número:
# grep ‘^[^0-9]‘ test
Villa Dalmine
Restaurador de Leyes de Argentina
JMR
Argelia
Argelia
Modificadores
Existen dos tipos de expresiones regulares: básicas y extendidas. Las expresiones regualares extendidas consideran ciertos caracteres como especiales. En las expresiones regulares básicas para que dicho carácter tenga un sentido especial es necesario anteponerle una contra barra, tal como se muestra a continuación:
Extendidas | Básicas | Descripción |
* | * | Identifica cero o más veces un único carácter. |
? | /? | Identifica cero o una vez la expresión regular que antecede. |
+ | /+ | Identifica una o más veces la expresión regular que antecede. |
{n,m} | /{n,m} | Identifica un rango de ocurrencias (un caracter o una expresión regular) que antecede. Debe identificar al menos n hasta m ocurrencias. |
| | /| | Identifica una u otra. Función lógica OR. |
(regex) | \(regex\) | Agrupa. Identifica grupo de expresiones regulares. |