Una de las operaciones más utilizadas en la terminal de Linux es la búsqueda a través de archivos de texto y el filtrado de flujos de error o salida estándar. Linux proporciona una gran herramienta que nos permite resolver esa tarea con facilidad:grep. En este artículo, cubriremos los casos de uso más comunes para grep que definitivamente simplificarán su rutina diaria.
Que es grep
Grep significa impresión de expresión regular global. Esta es una utilidad muy útil cuando se trata de buscar en un gran conjunto de archivos de texto (registros, por ejemplo).
Grep es el comando más útil en Linux/Unix para administradores de sistemas, desarrolladores e ingenieros de DevOps. El propósito principal de esta herramienta es verificar cadenas o patrones en un archivo específico, o filtrar la salida de otros comandos.
Este patrón que mencionamos anteriormente, se conoce como expresión regular.
El comando grep imprime una línea en el terminal con la cadena si encuentra una coincidencia con la consulta de búsqueda.
Hay muchos ejemplos diferentes del uso de grep, así que veamos cómo y cuándo puedes usarlo.
Instalación de grep en Linux
Por lo general, grep se instala en la mayoría de los sistemas Linux e incluso en pequeños contenedores Docker. Pero si no lo tienes instalado en tu sistema, puedes hacerlo usando el siguiente comando, por ejemplo:
apt-get updateapt-get install -y grep
ejemplos de uso de grep
En esta parte del artículo, cubriremos los ejemplos más comunes del uso de grep.
Filtrar la salida de un comando
Puede usar el comando grep para buscar e imprimir cualquier línea de cualquier salida de comando de Linux que coincida con el patrón especificado.
En este ejemplo, comprobaremos qué paquetes de Python 3 tenemos en nuestro sistema Ubuntu:
dpkg -l | grep python3
En este ejemplo:
dpkg -l
imprimirá todos los paquetes instaladosgrep
filtrarádpkg
salida e impresión de solo cadenas, que contienenpython3
cadena
De la misma manera, puede mostrar la información del modelo de CPU, por ejemplo:
grep -i 'Model' /proc/cpuinfo
Buscando cadena dentro de un archivo
En este ejemplo, el comando grep buscará la cadena "raíz" en el archivo '/etc/passwd' y lo imprimirá si se encuentra la cadena.
Por lo general, usamos este comando para verificar si el sistema tiene una cuenta de usuario con un nombre específico (ejemplo de root in out):
grep root /etc/passwd
Buscar en varios archivos
Para encontrar la cadena en varios archivos a la vez, use el comando grep y especifique los nombres de los archivos en una sola fila. Puede usar expresiones regulares para buscar archivos por máscara.
Descarguemos Apache access.log de acceso público:
mkdir -p /var/log/httpd
cd /var/log/httpd
wget http://www.almhuette-raith.at/apache-log/access.log
Ahora, dividamos este archivo en varios archivos por 10000 líneas en el archivo:
Ahora, podemos buscar en los archivos el error del servidor HTTP 500:
grep ' 500 ' xac xad
Para buscar en todos los archivos dentro del directorio de trabajo actual, use *
después del patrón.
En el siguiente ejemplo, el comando grep buscará 500 errores de servidor en todos los archivos:
grep ' 500 ' *
Búsqueda de palabras completas
Con el -w
opción en el comando grep, puede buscar los archivos que contienen un patrón de palabra:
grep -w 'Windows XP' *
Búsqueda que no distingue entre mayúsculas y minúsculas
El comando grep es lo suficientemente inteligente como para permitirnos realizar búsquedas independientemente de la distinción entre mayúsculas y minúsculas del patrón de búsqueda.
Para hacer eso, necesitamos usar -i
como argumento.
Este es el mismo ejemplo, pero ahora estamos filtrando mayúsculas y minúsculas:
grep -i -w 'windows xp' *
Archivos de salida que contienen patrón de búsqueda
Puedes usar -l
opción para mostrar todos los nombres de archivo que contienen el patrón buscado:
grep -l -i -w 'windows xp' *
Contar coincidencias por archivo
Si desea saber la cantidad de veces que su patrón coincidió en todos los archivos, agregue -c
opción:
grep -c -i -w 'windows xp' *
Número de líneas antes del patrón buscado
Para ver las líneas en un archivo antes del patrón de búsqueda, agregue -B
argumento seguido de la cantidad de números que desea recuperar del archivo:
grep -B 3 -i -w 'windows xp' xaf
Número de líneas después del patrón buscado
Del mismo modo, puede usar -A
argumento para especificar el número de líneas a imprimir después del patrón buscado:
grep -A 3 -i -w 'windows xp' xaf
Imprime el número de línea para la coincidencia del patrón de búsqueda
Para ver el número de línea del patrón buscado encontrado, puede usar -n
argumento:
grep -n -i -w 'windows xp' xaf
Hacer coincidir el comienzo de la cadena
En el siguiente ejemplo, usaremos el comando grep para encontrar todas las solicitudes originadas desde la dirección IP específica.
Todas las líneas buscadas deben comenzar desde el 5.34.180.192
plazo.
grep "^5.34.180.192" xaf
Hacer coincidir el final de la cadena
Añadir $
hasta el final del patrón para encontrar líneas que terminen con la cadena buscada:
grep "Chrome/62\" \"-\"$" xaf
Tan pronto como nuestra cadena de búsqueda contenga "
símbolos, los estamos escapando con el \
.
Búsqueda de múltiples patrones
Podemos usar grep para buscar múltiples patrones a la vez. Añadir -e
argumento antes de cada patrón de búsqueda:
grep -e "Chrome/62\" \"-\"$" -e "15/Mar/2021:08:35:23" xaf
Aquí, estamos buscando todas las cadenas en el archivo que terminan en Chrome/62" "-"
Y contener fecha y hora específicas 15/Mar/2021:08:35:23
.
Cambiando el color de salida
Como la salida en color aumenta la legibilidad, puede cambiarla a su color favorito configurando GREP_COLOR
variable de entorno:
GREP_COLOR='1;35' grep --color=always 'admin' /etc/passwd
Puede obtener más información sobre la variable GREP_COLOR en la documentación oficial de grep.
Resumen
El comando grep es extremadamente útil cuando se trata de filtrar el contenido de los archivos de texto o el resultado de salida de los comandos. En este artículo, cubrimos los comandos grep más utilizados, que agilizarán su experiencia de shell.
Esperamos que este artículo te haya resultado útil. Si es así, por favor, ayúdanos a difundirlo por el mundo.