Cómo usar el comando grep en Linux

Un indicador de terminal en una PC con Linux.
Fatmawati Achmad Zaenuri / Shutterstock

El grepcomando de Linux es una utilidad de coincidencia de cadenas y patrones que muestra líneas coincidentes de varios archivos. También funciona con salida canalizada de otros comandos. Te mostramos cómo.

La historia detrás de grep

El grepcomando es famoso en los círculos de Linux y Unix por tres razones. En primer lugar, es tremendamente útil. En segundo lugar, la gran cantidad de opciones puede ser abrumadora . En tercer lugar, se escribió de la noche a la mañana para satisfacer una necesidad particular. Los dos primeros están muy bien; el tercero está un poco apagado.

Ken Thompson había extraído las capacidades de búsqueda de expresiones regulares del ededitor ( pronunciado ee-dee ) y creó un pequeño programa, para su propio uso, para buscar en archivos de texto. Su jefe de departamento en Bell Labs , Doug Mcilroy , se acercó a Thompson y le describió el problema que enfrentaba uno de sus colegas, Lee McMahon .

McMahon estaba tratando de identificar a los autores de los artículos federalistas a través del análisis textual. Necesitaba una herramienta que pudiera buscar frases y cadenas en archivos de texto. Thompson dedicó aproximadamente una hora esa noche a hacer de su herramienta una utilidad general que otros podrían usar y cambiarle el nombre a grep. Tomó el nombre de la edcadena de comandos g/re/p, que se traduce como «búsqueda global de expresiones regulares».

Puedes ver a Thompson hablando con Brian Kernighan sobre el nacimiento de grep.

Búsquedas simples con grep

Para buscar una cadena dentro de un archivo, pase el término de búsqueda y el nombre del archivo en la línea de comando:

grep dave / etc / password en una terminal widnow

Se muestran las líneas coincidentes. En este caso, es una sola línea. El texto coincidente se resalta. Esto se debe a que en la mayoría de las distribuciones greptiene un alias para:

alias grep = 'grep --colour = auto'

Veamos los resultados donde hay varias líneas que coinciden. Buscaremos la palabra «Promedio» en un archivo de registro de la aplicación. Como no podemos recordar si la palabra está en minúsculas en el archivo de registro, usaremos la -i opción (ignorar mayúsculas y minúsculas):

grep -i Promedio geek-1.log

grep -i Promedio geek-1.log en una ventana de terminal

Se muestran todas las líneas coincidentes, con el texto coincidente resaltado en cada una.

Salida de grep -i Average geek-1.log en una ventana de terminal

Podemos mostrar las líneas que no coinciden usando la opción -v (coincidencia invertida).

grep -v Mem geek-1.log

grep -v Mem geek-1.log en una ventana de terminal

No hay resaltado porque estas son las líneas que no coinciden.

salida de grep -v Mem geek-1.log en una ventana de terminal

Podemos hacer grepque nos quedemos completamente en silencio. El resultado se pasa al shell como un valor de retorno de grep. Un resultado de cero significa que se encontró la cadena y un resultado de uno significa que no se encontró. Podemos verificar el código de retorno usando los  $? parámetros especiales :

grep -q promedio geek-1.log
echo $?
grep -q howtogeek geek-1.log
echo $?

grep -q average geek-1.log en una ventana de terminal

Búsquedas recursivas con grep

Para buscar en directorios y subdirectorios anidados, use la opción -r (recursiva). Tenga en cuenta que no proporciona un nombre de archivo en la línea de comando, debe proporcionar una ruta. Aquí estamos buscando en el directorio actual «.» y cualquier subdirectorio:

grep -r -i memfree.

grep -r -i memfree.  en una ventana de terminal

La salida incluye el directorio y el nombre de archivo de cada línea coincidente.

Relacionado:  Cómo controlar el acceso a sudo en Linux

salida de grep -r -i memfree.  en una ventana de terminal

Podemos hacer  grep  seguir enlaces simbólicos usando la -Ropción (desreferencia recursiva). Tenemos un enlace simbólico en este directorio, llamado logs-folder. Apunta a /home/dave/logs.

ls -l carpeta-registros

ls -l carpeta de registros en una ventana de terminal

Repitamos nuestra última búsqueda con la  -Ropción (desreferencia recursiva):

grep -R -i memfree.

grep -R -i memfree.  en una ventana de terminal

Se sigue el enlace simbólico y también se busca en el directorio al que apunta grep.

Salida de grep -R -i memfree.  en una ventana de terminal

Buscando palabras completas

De forma predeterminada, grepcoincidirá con una línea si el objetivo de búsqueda aparece en cualquier lugar de esa línea, incluso dentro de otra cadena. Mira este ejemplo. Vamos a buscar la palabra «gratis».

grep -i free geek-1.log

grep -i free geek-1.log en una ventana de terminal

Los resultados son líneas que tienen la cadena «libre» en ellas, pero no son palabras separadas. Son parte de la cadena «MemFree».

Salida de grep -i free geek-1.log en una ventana de terminal

Para forzar la grep coincidencia de «palabras» separadas solamente, use la -wopción ( expresión regular de palabras).

grep -w -i gratis geek-1.log
echo $?

grep -w -i free geek-1.log en una ventana de terminal

Esta vez no hay resultados porque el término de búsqueda «gratis» no aparece en el archivo como una palabra separada.

Uso de varios términos de búsqueda

La -Eopción (expresión regular extendida) le permite buscar varias palabras. (La -Eopción reemplaza la egrep versión obsoleta de grep).

Este comando busca dos términos de búsqueda, «promedio» y «memfree».

grep -E -w -i "promedio | memfree" geek-1.log

grep -E -w -i "promedio | memfree" geek-1.log en una ventana de terminal

Todas las líneas coincidentes se muestran para cada uno de los términos de búsqueda.

Salida de grep -E -w -i "average | memfree" geek-1.log en una ventana de terminal

También puede buscar varios términos que no son necesariamente palabras completas, pero también pueden ser palabras completas.

La -eopción (patrones) le permite utilizar varios términos de búsqueda en la línea de comandos. Estamos utilizando la función de corchetes de expresiones regulares para crear un patrón de búsqueda. Dice grepque coincida con cualquiera de los caracteres contenidos entre los corchetes «[]». Esto significa grepcoincidirá con “kB” o “KB” mientras busca.

grep -e MemFree -e [kK] B geek-1.log en una ventana de terminal

Ambas cadenas coinciden y, de hecho, algunas líneas contienen ambas cadenas.

Salida de grep -e MemFree -e [kK] B geek-1.log en una ventana de terminal

Coincidencia exacta de líneas

La  -x(regexp de línea) solo coincidirá con las líneas donde toda la línea coincide con el término de búsqueda. Busquemos una marca de fecha y hora que sabemos que aparece solo una vez en el archivo de registro:

grep -x "20-Ene - 06 15:24:35" geek-1.log

grep -x "20-Jan - 06 15:24:35" geek-1.log en una ventana de terminal

La única línea que coincide se encuentra y se muestra.

Relacionado:  Cómo usar pushd y popd en Linux

Lo contrario de eso es solo mostrar las líneas que no coinciden. Esto puede ser útil cuando busca archivos de configuración. Los comentarios son geniales, pero a veces es difícil identificar la configuración real entre todos ellos. Aquí está el /etc/sudoersarchivo:

Contenido del archivo / etc / sudoers en una ventana de terminal

Podemos filtrar efectivamente las líneas de comentarios de esta manera:

sudo grep -v "#" / etc / sudoers

sudo grep -v "#" / etc / sudoers en una ventana de terminal

Eso es mucho más fácil de analizar.

Visualización únicamente de texto coincidente

Puede haber una ocasión en la que no desee ver toda la línea coincidente, solo el texto coincidente. La -oopción (única coincidencia) hace precisamente eso.

grep -o MemFree geek-1.log

grep -o MemFree geek-1.log en una ventana de terminal

La pantalla se reduce a mostrar solo el texto que coincide con el término de búsqueda, en lugar de toda la línea coincidente.

salida de grep -o MemFree geek-1.log en una ventana de terminal

Contando con grep

grepno se trata solo de texto, también puede proporcionar información numérica. Podemos hacer que grepvalga la pena para nosotros de diferentes maneras. Si queremos saber cuántas veces aparece un término de búsqueda en un archivo, podemos usar la -copción (contar).

grep -c promedio geek-1.log

grep -c average geek-1.log en una ventana de terminal

grep informa que el término de búsqueda aparece 240 veces en este archivo.

Puede hacer que se grepmuestre el número de línea para cada línea coincidente utilizando la -nopción (número de línea).

grep -n Jan geek-1.log

grep -n jan geek-1.log en una ventana de terminal

El número de línea para cada línea coincidente se muestra al principio de la línea.

Salida de grep -n jan geek-1.log en una ventana de terminal

Para reducir la cantidad de resultados que se muestran, use la -mopción (recuento máximo). Vamos a limitar la salida a cinco líneas coincidentes:

grep -m5 -n enero geek-1.log

grep -m5 -n Jan geek-1.log en una ventana de terminal

Agregar contexto

A menudo resulta útil poder ver algunas líneas adicionales, posiblemente líneas que no coinciden, para cada línea coincidente. puede ayudar a distinguir cuáles de las líneas coincidentes son las que le interesan.

Para mostrar algunas líneas después de la línea coincidente, use la opción -A (después del contexto). Estamos solicitando tres líneas en este ejemplo:

grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log

grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log en una ventana de terminal

Para ver algunas líneas antes de la línea coincidente, use la -Bopción (contexto antes).

grep -B 3 -x "20-Ene-06 15:24:35" geek-1.log

grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log en una ventana de terminal

Y para incluir líneas antes y después de la línea coincidente, use la -Copción (contexto).

grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log

grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log en una ventana de terminal

Mostrar archivos coincidentes

Para ver los nombres de los archivos que contienen el término de búsqueda, use la -l opción (archivos con coincidencia). Para averiguar qué archivos de código fuente C contienen referencias al sl.harchivo de encabezado, use este comando:

grep -l "sl.h" * .c

grep -l "sl.h" * .c en una ventana de terminal

Se enumeran los nombres de los archivos, no las líneas coincidentes.

Relacionado:  Cómo usar el comando look en Linux

Salida de grep -l "sl.h" * .c en una ventana de terminal

Y, por supuesto, podemos buscar archivos que no contengan el término de búsqueda. La -Lopción (archivos sin coincidencia) hace precisamente eso.

grep -L "sl.h" * .c

grep -L "sl.h" * .c en una ventana de terminal

Inicio y fin de líneas

Podemos forzar grepa mostrar solo las coincidencias que están al principio o al final de una línea. El operador de expresión regular “^” coincide con el comienzo de una línea. Prácticamente todas las líneas dentro del archivo de registro contendrán espacios, pero vamos a buscar líneas que tengan un espacio como primer carácter:

grep "^" geek-1.log

grep "^" geek-1.log en una ventana de terminal

Se muestran las líneas que tienen un espacio como primer carácter, al comienzo de la línea.

Salida grep "^" geek-1.log en una ventana de terminal

Para hacer coincidir el final de la línea, use el operador de expresión regular «$». Vamos a buscar líneas que terminen en «00».

grep "00 $" geek-1.log

grep "00 $" geek-1.log en una ventana de terminal

La pantalla muestra las líneas que tienen «00» como caracteres finales.

salida de grep "00 $" geek-1.log en una ventana de terminal

Usando Pipes con grep

Por supuesto, puede canalizar la entrada grep, canalizar la salida desde grepotro programa y estar grepubicado en el medio de una cadena de canalizaciones.

Digamos que queremos ver todas las apariciones de la cadena «ExtractParameters» en nuestros archivos de código fuente C. Sabemos que habrá bastantes, por lo que canalizamos la salida a less:

grep "ExtractParameters" * .c | Menos

grep "ExtractParameters" * .c |  menos en una ventana de terminal

La salida se presenta en formato less.

Salida de grep "ExtractParameters" * .c |  menos en una ventana de terminal

Esto le permite desplazarse por la lista de archivos y utilizar la función de less'sbúsqueda.

Si nos canalizar la salida desde grepdentro wcy usar la -lopción (líneas), que podemos contar el número de líneas en los archivos de código fuente que contienen “ExtractParameters”. (Podríamos lograr esto usando la grep -copción (contar), pero esta es una buena manera de demostrar la tubería fuera grep).

grep "ExtractParameters" * .c | wc -l

grep "ExtractParameters" * .c |  wc -l en una ventana de terminal

Con el siguiente comando, estamos canalizando la salida desde lsdentro grepy canalizando la salida desde grepdentro sort. Enumeramos los archivos en el directorio actual, seleccionamos los que tienen la cadena «Aug» y los clasificamos por tamaño de archivo :

ls -l | grep "agosto" | ordenar + 4n

ls -l |  grep "agosto" |  ordenar + 4n en una ventana de terminal

Analicemos eso:

  • ls -l : Realiza una lista de formato larga de los archivos usando ls.
  • grep «Aug» : seleccione las líneas de la lslista que tienen «Aug» en ellas. Tenga en cuenta que esto también buscaría archivos que tengan «Aug» en sus nombres.
  • sort + 4n : ordena la salida de grep en la cuarta columna ().

Obtenemos una lista ordenada de todos los archivos modificados en agosto (independientemente del año), en orden ascendente de tamaño de archivo.

grep: Menos un comando, más un aliado

grepes una excelente herramienta para tener a su disposición. Data de 1974 y todavía se mantiene fuerte porque necesitamos lo que hace, y nada lo hace mejor.

Combinar grepcon algunas expresiones regulares-fu realmente lo lleva al siguiente nivel.