Un indicador de terminal en una PC con Linux.

Cómo usar el comando grep en Linux

Fatmawati Achmad Zaenuri / Shutterstock

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

La historia detrás de grep

la grep El comando es famoso en Linux y Unix círculos por tres razones. Primero, es extremadamente útil. Segundo, el 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 son perfectos; el tercero está ligeramente compensado.

Ken Thompson había extraído el expresión regular capacidades de investigación ed editor (pronunciado ee-dee) y creó un pequeño programa, para su propio uso, para buscar archivos de texto. Su jefe de departamento en Laboratorios Bell, Doug Mcilroy, se acercó a Thompson y le describió el problema a uno de sus colegas, Lee mcmahon, enfrentó.

McMahon estaba tratando de identificar a los perpetradores del Papeles Federalistas por análisis textual. Necesitaba una herramienta que pudiera encontrar frases y cadenas en archivos de texto. Thompson dedicó aproximadamente una hora esa noche a hacer de su herramienta una utilidad general que pudieran usar otros y le cambió el nombre a grep. Tomó el nombre de ed cadena de comando g/re/p , que se traduce como «búsqueda global de expresiones regulares».

Puedes ver a Thompson hablar Para Brian Kernighan en el nacimiento de grep.

Búsquedas simples con grep

Para buscar una cadena en 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 correspondientes. En este caso, es una sola línea. El texto correspondiente está resaltado. Esto se debe a que en la mayoría de las distribuciones grep es alias:

alias grep='grep --colour=auto'

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

grep -i Average geek-1.log

Se muestra cada fila coincidente, con el texto correspondiente resaltado en cada una.

Podemos mostrar las filas no coincidentes usando la opción -v (coincidencia inversa).

grep -v Mem geek-1.log

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

Podemos provocar grep estar completamente en silencio. El resultado se pasa al shell como el 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 el $? parámetros especiales:

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

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 para «.» y todos los subdirectorios:

grep -r -i memfree .

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

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

ls -l logs-folder

Repitamos nuestra última búsqueda con el -R opción (desreferencia recursiva):

grep -R -i memfree .

Se sigue el enlace simbólico y se busca el directorio al que apunta. grep demasiado.

Búsqueda de palabra completa

Por defecto, grep coincidirá con una fila si el objetivo de búsqueda aparece en cualquier lugar de esa fila, incluso dentro de otra cadena. Echale un vistazo a éste ejemplo. Buscaremos la palabra «gratis».

grep -i free geek-1.log

Los resultados son líneas que contienen la cadena «libre», pero no son palabras separadas. Forman parte de la cadena «MemFree».

Forzar grep para hacer coincidir solo «palabras» separadas, utilice la -w (expresión de palabra regular).

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

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

Uso de múltiples términos de búsqueda

la -E (Regexp extendido) le permite buscar varias palabras. (El -E opción reemplaza lo obsoleto egrep versión de grep.)

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

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

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

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

la -e La opción (patrones) le permite utilizar varios términos de búsqueda en la línea de comandos. Usamos la función de gancho de expresión regular para crear un patrón de búsqueda. dice grep coincidir con uno de los caracteres entre paréntesis «[]. » Eso significa grep coincidirá con «kB» o «KB» al realizar la búsqueda.

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

Coincidencia de línea exacta

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

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

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

Lo contrario es mostrar solo las líneas que no coinciden. Esto puede resultar útil al visualizar archivos de configuración. Las críticas son geniales, pero a veces es difícil detectar la configuración real entre todas ellas. he aquí el /etc/sudoers expediente:

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

sudo grep -v "https://www.howtogeek.com/496056/how-to-use-the-grep-command-on-linux/#" /etc/sudoers

Es mucho más fácil de analizar.

Mostrar solo texto coincidente

Puede haber ocasiones en las que no desee ver toda la línea coincidente, solo el texto coincidente. la -o (solo coincidencia) la opción hace exactamente eso.

grep -o MemFree geek-1.log

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.

Contando con grep

grep no se trata solo de texto, también puede proporcionar información digital. Podemos hacer grep nos importan de diferentes maneras. Si queremos saber cuántas veces aparece un término de búsqueda en un archivo, podemos usar el -c (recuento) opción.

grep -c average geek-1.log

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

Tu puedes hacer grep mostrar el número de línea para cada línea correspondiente utilizando el -n opción (número de línea).

grep -n Jan geek-1.log

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

Para reducir el número de resultados mostrados, utilice el -m (número máximo) opción. Limitaremos la salida a cinco líneas correspondientes:

grep -m5 -n Jan geek-1.log

Agregar contexto

A menudo es útil poder ver líneas adicionales, quizás líneas que no coinciden, para cada línea coincidente. esto 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 correspondiente, 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

Para ver algunas líneas antes de la línea correspondiente, use el -B (contexto antes) opción.

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

Y para incluir las líneas antes y después de la línea correspondiente, use el -C opción (contexto).

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

Ver archivos coincidentes

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

grep -l "sl.h" *.c

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

Y, por supuesto, podemos buscar archivos que no contengan el término de búsqueda. la -L (archivos incomparables) hace exactamente eso.

grep -L "sl.h" *.c

Inicio y final de línea

Podemos forzar grep para 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. Casi todas las líneas del archivo de registro contendrán espacios, pero buscaremos líneas donde el primer carácter sea un espacio:

grep "^ " geek-1.log

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

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

grep "00$" geek-1.log

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

Usando Pipes con grep

Por supuesto, puedes dirigir la entrada a grep , dirija la salida de grep en otro programa y tener grep enclavado en medio de una cadena de tuberías.

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

grep "ExtractParameters" *.c | less

La salida se presenta en less.

Esto le permite navegar por la lista de archivos y usar less's facilidad de búsqueda.

Si dirigimos la salida de grep dentro wc y usa el -l opción (líneas), nosotros puede contar el número de líneas en los archivos de código fuente que contienen «ExtractParameters». (Podríamos lograr esto usando el grep -c (recuento) opción, pero es una buena manera de demostrar la tubería fuera de grep.)

grep "ExtractParameters" *.c | wc -l

Con el siguiente comando, enrutamos la salida de ls dentro grep y canalizar la salida de grep dentro sort . Enumeramos los archivos en el directorio actual, seleccionando aquellos que contienen la cadena «Aug», y ordenarlos por tamaño de archivo:

ls -l | grep "Aug" | sort +4n

Analicemos esto:

  • ls -l: Crea una lista larga de archivos en formato ls.
  • grep «agosto»: seleccione las líneas del ls lista que tienen «Aug» en ellos. Tenga en cuenta que esto también buscaría archivos que tengan «Aug» en sus nombres.
  • ordenar + 4n: ordena la salida de grep en la cuarta columna (tamaño del archivo).

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

grep es una gran herramienta para tener a su disposición. Se remonta a 1974 y todavía se mantiene fuerte porque necesitamos lo que hace, y nada lo hace mejor.

Acoplamiento grep con algunas expresiones regulares, fu realmente lo lleva al siguiente nivel.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Experto Geek - Tu Guía en Tendencias Tecnológicas