Cómo usar el comando grep en Linux
Publicado: 2022-01-29 El comando grep
de Linux 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 comandos. Te mostramos cómo.
La historia detrás de grep
El comando grep
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, fue escrito de la noche a la mañana para satisfacer una necesidad particular. Los dos primeros están en marcha; el tercero está ligeramente apagado.
Ken Thompson había extraído las capacidades de búsqueda de expresiones regulares del editor ed
(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 al que se 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 dentro de archivos de texto. Thompson pasó alrededor de una hora esa noche haciendo que su herramienta fuera una utilidad general que otros pudieran usar y la renombró como grep
. Tomó el nombre de la cadena de comando ed
g/re/p
, que se traduce como "búsqueda de expresión regular global".
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:
Se muestran las líneas coincidentes. En este caso, es una sola línea. El texto coincidente está resaltado. Esto se debe a que en la mayoría de las distribuciones, grep
tiene un alias para:
alias grep='grep --color=auto'
Veamos los resultados en los que 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 opción -i
(ignorar mayúsculas y minúsculas):
grep -i Promedio geek-1.log
Se muestran todas las líneas coincidentes, con el texto coincidente resaltado en cada una.
Podemos mostrar las líneas que no coinciden usando la opción -v (invertir coincidencia).
grep -v Mem geek-1.log
No hay resaltado porque estas son las líneas que no coinciden.
Podemos hacer que grep
esté 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 el $?
parámetros especiales:
grep -q promedio geek-1.log
eco $?
grep -q howtogeek geek-1.log
eco $?
Búsquedas recursivas con grep
Para buscar en directorios y subdirectorios anidados, utilice 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 libre de memoria.
La salida incluye el directorio y el nombre de archivo de cada línea coincidente.
Podemos hacer que grep
siga enlaces simbólicos usando la opción -R
(referencia recursiva). Tenemos un enlace simbólico en este directorio, llamado logs-folder
. Apunta a /home/dave/logs
.
ls -l carpeta de registros
Repitamos nuestra última búsqueda con la opción -R
(referencia recursiva):
grep -R -i libre de memoria.
Se sigue el enlace simbólico y grep
también busca el directorio al que apunta.
Búsqueda de palabras completas
De forma predeterminada, grep
coincidirá 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 gratis geek-1.log
Los resultados son líneas que tienen la cadena "libre", pero no son palabras separadas. Son parte de la cadena "MemFree".
Para forzar a grep
a que coincida solo con "palabras" separadas, use la opción -w
(palabra expresión regular).
grep -w -i gratis geek-1.log
eco $?
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 opción -E
(expresión regular extendida) le permite buscar varias palabras. (La opción -E
reemplaza la versión egrep
obsoleta de grep
).
Este comando busca dos términos de búsqueda, "promedio" y "memfree".
grep -E -w -i "promedio|memfree" geek-1.log
Todas las líneas coincidentes se muestran para cada uno de los términos de búsqueda.
También puede buscar varios términos que no sean necesariamente palabras completas, pero también pueden ser palabras completas.
La opción -e
(patrones) le permite usar múltiples términos de búsqueda en la línea de comando. Estamos haciendo uso de la función de paréntesis de expresión regular para crear un patrón de búsqueda. Le dice a grep
que coincida con cualquiera de los caracteres contenidos entre corchetes "[]". Esto significa que grep
coincidirá con "kB" o "KB" mientras busca.
Ambas cadenas coinciden y, de hecho, algunas líneas contienen ambas cadenas.
Coincidencia de líneas exactamente
La -x
(regexp de línea) solo coincidirá con las líneas en las que la línea completa coincida 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
La única línea que coincide se encuentra y se muestra.
Lo contrario de eso es mostrar solo las líneas que no coinciden. Esto puede ser útil cuando está mirando archivos de configuración. Los comentarios son geniales, pero a veces es difícil detectar la configuración real entre todos ellos. Aquí está el /etc/sudoers
:
Podemos filtrar efectivamente las líneas de comentarios de esta manera:
sudo grep -v "#" /etc/sudoers
Eso es mucho más fácil de analizar.
Mostrar solo texto coincidente
Puede haber una ocasión en la que no desee ver la línea coincidente completa, solo el texto coincidente. La opción -o
(solo coincidencia) hace precisamente 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 la línea de coincidencia completa.
Contando con grep
grep
no se trata solo de texto, también puede proporcionar información numérica. Podemos hacer que grep
cuente para nosotros de diferentes maneras. Si queremos saber cuántas veces aparece un término de búsqueda en un archivo, podemos utilizar la opción -c
(recuento).
grep -c promedio geek-1.log
grep
informa que el término de búsqueda aparece 240 veces en este archivo.
Puede hacer que grep
muestre el número de línea para cada línea coincidente usando la opción -n
(número de línea).
grep -n Jan geek-1.log
El número de línea para cada línea coincidente se muestra al comienzo de la línea.
Para reducir la cantidad de resultados que se muestran, use la opción -m
(recuento máximo). Vamos a limitar la salida a cinco líneas coincidentes:
grep -m5 -n Jan geek-1.log
Agregar contexto
A menudo es ú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 correspondiente, use la opción -A (después del contexto). Estamos pidiendo tres líneas en este ejemplo:
grep -A 3 -x "20-ene-06 15:24:35" geek-1.log
Para ver algunas líneas antes de la línea coincidente, use la opción -B
(contexto anterior).
grep -B 3 -x "20-ene-06 15:24:35" geek-1.log
Y para incluir líneas antes y después de la línea coincidente, use la opción -C
(contexto).
grep -C 3 -x "20-ene-06 15:24:35" geek-1.log
Mostrar archivos coincidentes
Para ver los nombres de los archivos que contienen el término de búsqueda, use la opción -l
(archivos con coincidencia). Para averiguar qué archivos de código fuente C contienen referencias al archivo de encabezado sl.h
, use este comando:
grep -l "sl.h" *.c
Se enumeran los nombres de los archivos, no las líneas coincidentes.
Y por supuesto, podemos buscar archivos que no contengan el término de búsqueda. La opción -L
(archivos sin coincidencia) hace precisamente eso.
grep -L "sl.h" *.c
Inicio y Fin de Líneas
Podemos obligar a grep
a 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 inicio 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 "^" friki-1.log
Se muestran las líneas que tienen un espacio como primer carácter, al comienzo de la línea.
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
La pantalla muestra las líneas que tienen "00" como carácter final.
Usando tuberías con grep
Por supuesto, puede canalizar la entrada a grep
, canalizar la salida de grep
a otro programa y tener grep
ubicado en el 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 canalizamos la salida a less
:
grep "Extraer Parámetros" *.c | menos
La salida se presenta en less
.
Esto le permite navegar a través de la lista de archivos y utilizar less's
.
Si canalizamos la salida de grep
a wc
y usamos la opción -l
(líneas), podemos contar el número de líneas en los archivos de código fuente que contienen "ExtractParameters". (Podríamos lograr esto usando la opción grep
-c
(recuento), pero esta es una buena manera de demostrar la canalización de grep
).
grep "Extraer Parámetros" *.c | wc-l
Con el siguiente comando, estamos canalizando la salida de ls
a grep
y canalizando la salida de grep
a sort
. Estamos enumerando los archivos en el directorio actual, seleccionando aquellos con la cadena "Aug" en ellos y ordenándolos por tamaño de archivo:
ls-l | grep "agosto" | ordenar +4n
Vamos a desglosarlo:
- ls -l : Realiza una lista de formato largo de los archivos usando
ls
. - grep "Aug" : seleccione las líneas de la lista
ls
que tienen "Aug" en ellas. Tenga en cuenta que esto también encontraría archivos que tienen "Aug" en sus nombres. - sort +4n : ordena la salida de grep en la cuarta columna (tamaño de archivo).
Obtenemos una lista ordenada de todos los archivos modificados en agosto (independientemente del año), en orden ascendente de tamaño de archivo.
RELACIONADO: Cómo usar tuberías en Linux
grep: menos comando, más aliado
grep
es 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 grep
con algunas expresiones regulares-fu realmente lo lleva al siguiente nivel.
RELACIONADO: Cómo usar expresiones regulares básicas para buscar mejor y ahorrar tiempo
Comandos Linux | ||
archivos | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · cola · stat · ls · fstab · eco · menos · chgrp · chown · rev · mirar · cadenas · tipo · renombrar · zip · descomprimir · montar · desmontar · instalar · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · parche · convertir · rclone · triturar · srm | |
Procesos | alias · pantalla · top · agradable · renice · progreso · strace · systemd · tmux · chsh · historia · at · lote · gratis · cual · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · tiempo de espera · pared · sí · matar · dormir · sudo · su · hora · groupadd · usermod · grupos · lshw · apagar · reiniciar · detener · apagar · contraseña · lscpu · crontab · fecha · bg · fg | |
Redes | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · cavar · dedo · nmap · ftp · curl · wget · quién · whoami · w · iptables · ssh-keygen · ufw |
RELACIONADO: Las mejores computadoras portátiles Linux para desarrolladores y entusiastas