Linux y sistemas similares a UNIX, toda la información de configuración del sistema se almacena y manipula en forma de texto sin formato. Por lo tanto, la búsqueda de texto sería una tarea muy común para la edición y el análisis de registros.
El comando grep permite buscar un texto o cadena en un archivo o desde la consola de salida de un comando, por un término o patrón que coincida con expresiones regulares. Cuando grep encuentra una coincidencia en una línea, copia los resultados en la pantalla, es decir, stdout.
En este tutorial aprendemos a usar el comando grep con ejemplos prácticos.
Comando Grep
Revisemos la sintaxis del comando grep antes de comenzar a explicar su uso.
grep [OPTIONS] PATTERN [FILE...]
Discutiremos en detalle las opciones y patrones de grep más comunes que podemos usar para buscar.
Cómo buscar una cadena en un archivo
En el siguiente ejemplo, grep busca en el archivo /etc/passwd la cadena 'root' y redirige la salida a stdout.
$ grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
Buscar texto de varios archivos
Puede buscar texto específico de varios archivos con el siguiente comando:
$ grep "root" /etc/passwd /etc/group
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin
/etc/group:root:x:0:root
/etc/group:bin:x:1:root,bin,daemon
/etc/group:daemon:x:2:root,bin,daemon
/etc/group:sys:x:3:root,bin,adm
/etc/group:adm:x:4:root,adm,daemon
/etc/group:disk:x:6:root
/etc/group:wheel:x:10:root
Búsqueda insensible a mayúsculas y minúsculas de Grep
Opciones -i
busca las mayúsculas y minúsculas de la cadena/patrón dadas de forma insensible.
En los siguientes ejemplos, grep coincide con todas las palabras como "hal", "HAL" sin distinción entre mayúsculas y minúsculas:
$ grep -i HAL /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
Búsqueda recursiva
La búsqueda recursiva se logra usando -r
opción que buscará recursivamente todo el archivo saltando enlaces simbólicos. Si desea incluir enlaces simbólicos, use -R
.
En el siguiente ejemplo, el comando grep buscará la cadena 'ngnix' en todos los archivos dentro de /var
directorio.
$ grep -r nginx /var
Buscar una cadena en la salida del comando (stdout)
Puede usar canalizar la salida para un comando y grep para el patrón de su salida.
En el siguiente ejemplo estoy buscando un archivo con el nombre 'backup' usando el comando ls
$ ls | grep backup
Aquí estoy haciendo múltiples tuberías y buscando el proceso 'docker' y 'apache' desde el comando ps.
$ ps -ef | grep docker | grep apache
Expresiones regulares en archivos
Expresiones regulares es un patrón para que coincida con cada línea de entrada. Basic y Extended son las dos expresiones regulares utilizadas por el comando grep.
Expresión regular básica
De forma predeterminada, grep interpreta el patrón como una expresión regular básica.
El símbolo ^ (símbolo de intercalación):el patrón que lo sigue debe aparecer al comienzo de cada línea. En el siguiente ejemplo, la cadena ^bienvenido coincidirá solo si aparece al principio de una línea.
$ grep “^welcome” filename
Expresión regular extendida
Utilice -E
(o --extended-regexp) si quiere que grep lo entienda como una expresión regular extendida.
El siguiente comando extraerá todos los enlaces de un archivo
$ grep –Eoi '<a[^>]+>.*</a>' filename
o
:Por defecto, grep imprime la línea completa que contiene el patrón de búsqueda. Esta opción indica al comando grep que imprima solo las palabras coincidentes en lugar de la línea completa.
i
:Esta opción solicita al comando grep que ignore las mayúsculas y minúsculas mientras coincide con el patrón.
Busca una palabra completa usando grep
El -w
(word-regexp) marca para grep hará que la expresión dada coincida solo con palabras completas.
$ grep -iw "samba" /etc/samba/smb.conf
# This is the main Samba configuration file. You should read the
# here. Samba has a huge number of configurable options (perhaps too
# For a step to step guide on installing, configuring and using samba,
# read the Samba-HOWTO-Collection. This may be obtained from:
Líneas de visualización después de la coincidencia de cadena
El -A
opción que muestra el N
líneas después de la coincidencia de cadena.
$ grep -A 2 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
Mostrar líneas antes de la coincidencia de cadena
Podemos usar -B
opción para mostrar N líneas antes de la cadena para un archivo dado
$ grep -B 2 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
--
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
Buscar varias cadenas
Podemos buscar múltiples patrones o cadenas usando el operador OR |
y \|
. -E
(extended-regexp) controla si necesita escapar de ciertos caracteres especiales. -e
es estrictamente la bandera para indicar el patrón con el que desea hacer coincidir.
Ejemplo 1:usando la opción -E
$ ls | grep -E “li|ovo”
linux24
ovo8_linux24.sh
O
$ grep -E "foo|bar" *.txt
Ejemplo 2:sin -E
$ ls | grep ‘li\|ovo’
linux24
ovo8_linux24.sh
O
$ grep "foo\|soul\|bar" *.txt
Excluir archivo específico de la búsqueda
Puede usar la opción -v para ignorar la búsqueda. El siguiente comando buscará la cadena 'error' en todos los archivos excepto 'syslog.log'
$ grep -r error * | grep -v ‘/\syslog.log/’
Conclusión
En este tutorial aprendimos a usar el comando grep para buscar texto en archivos. Espero que haya disfrutado leyendo esto y deje sus sugerencias en la sección de comentarios a continuación.