10 ejemplos de uso del comando grep en Linux para buscar archivos y contenido
La búsqueda de archivos y contenido en Windows tiene sus encantos, pero cuando necesito encontrar archivos o su contenido, o buscar información específica del sistema, el comando "grep" en Linux nunca deja de sorprenderme por su poder y versatilidad.
Existen varias versiones de grep; grep regular, egrep (grep extendido) y fgrep (grep fijo). Los dos últimos tienen diferentes métodos para trabajar con caracteres y cadenas de búsqueda. Me centraré en el grep regular para este artículo, que pretende ser un tutorial básico para este útil y confiable comando.
La sintaxis de grep es la siguiente:
grep [opciones] patrón [archivos]
Las opciones y patrones que puedes usar con grep son variados y diversos. Aquí hay 10 ejemplos para ayudarte a mejorar tus habilidades con este comando.
- 1. Buscar una palabra específica en un archivo
- 2. Buscar múltiples palabras en un archivo
- 3. Obtener el número de coincidencias
- 4. Mostrar los números de línea de cada coincidencia
- 5. Mostrar solo un número específico de coincidencias
- 6. Mostrar todas las entradas que NO coinciden
- 7. Buscar en varios archivos
- 8. Mostrar solo los nombres de archivo que coinciden con la búsqueda
- 9. Buscar mensajes registrados por fecha
- 10. Usar grep con otros comandos
1. Buscar una palabra específica en un archivo
Este es realmente uno de los usos más básicos de grep. Digamos que quiero inspeccionar el contenido del archivo /var/log/secure en busca de cualquier instancia de la palabra "failure". Tendría que escribir:
Cómo utilizar Isearch para buscar archivos de texto en Linuxgrep failure /var/log/secure
Este es un ejemplo de lo que grep podría devolver:
Apr 4 06:45:29 smatteso-vm1 sshd[14836]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost= qualys-corp.testdomain.com user=8boa5lv2rn8pso8
Apr 4 06:45:31 smatteso-vm1 sshd[14844]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost= qualys-corp.testdomain.com user=13hr26mnm8wo4k
Agrega el interruptor -i (por ejemplo, grep -i) para realizar una búsqueda que no distinga entre mayúsculas y minúsculas. En el ejemplo anterior, esto devolvería tanto "failure" en minúsculas como "FAILURE" en mayúsculas o cualquier combinación de ambos, como "Failure".
2. Buscar múltiples palabras en un archivo
Este comando te permite buscar múltiples palabras en un archivo. Observa el uso de comillas simples, la barra invertida y el comando pipe entre ellas:
grep 'opened\|closed' /var/log/secure
Guía para entender y gestionar los permisos de archivos y directorios en LinuxEsto es lo que grep podría devolver:
Apr 2 03:45:07 smatteso-vm1 sshd[16278]: Connection closed by 10.1.7.101
Apr 2 03:46:42 smatteso-vm1 su: pam_unix(su-l:session): session opened for user phxinst1 by (uid=0)
Apr 2 03:46:45 smatteso-vm1 su: pam_unix(su-l:session): session closed for user phxinst1
Apr 2 03:46:45 smatteso-vm1 su: pam_unix(su-l:session): session opened for user phxinst1 by (uid=0)
3. Obtener el número de coincidencias
Puede que no quieras ver la salida del comando grep, sino que solo te diga cuántas coincidencias encontró tu búsqueda. Esto se realiza usando el interruptor -c (count):
Cómo configurar un servidor Linux como puerta de enlace para una red localgrep failure /var/log/secure -c
Grep devolverá un número como este:
12
Puedes hacer algunas cosas inteligentes con este interruptor. Por ejemplo, si quieres saber cuántos procesadores hay en tu sistema, puedes escribir:
grep -c processor /proc/cpuinfo
4. Mostrar los números de línea de cada coincidencia
Puede ser útil saber en qué número de línea aparecen los resultados de tu búsqueda. Para hacerlo, agrega el interruptor -n (number):
Windows al alcance de Linux: Accede a recursos con smbmount y smbclientgrep -n failure /var/log/secure
Grep luego devolvería algo así:
1601:Apr 4 06:45:29 smatteso-vm1 sshd[14836]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost= qualys-corp.testdomain.com user=8boa5lv2rn8pso8
1612:Apr 4 06:45:31 smatteso-vm1 sshd[14844]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost= qualys-corp.testdomain.com user=13hr26mnm8wo4k
5. Mostrar solo un número específico de coincidencias
Supongamos que solo quiero ver los primeros cinco resultados de búsqueda. Puedo acotarlos usando el interruptor -m (recuento máximo):
grep -m5 failure /var/log/secure
Cómo configurar y utilizar logrotate para la gestión de archivos de registro en LinuxAquí tienes un ejemplo de los resultados:
Apr 4 06:45:29 smatteso-vm1 sshd[14836]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost= qualys-corp.testdomain.com user=8boa5lv2rn8pso8
Apr 4 06:45:31 smatteso-vm1 sshd[14844]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost= qualys-corp.testdomain.com
user=13hr26mnm8wo4k
Nota que no puede haber un espacio entre "-m" y el valor máximo de recuento.
6. Mostrar todas las entradas que NO coinciden
En algunos casos, puedes querer hacer una búsqueda inversa y mostrar los resultados que NO coinciden con tu entrada. Solo agrega el interruptor -v aquí. Por ejemplo, para ver las entradas en el archivo /var/log/secure que no representen la palabra "failure", escribe:
grep -v failure /var/log/secure
Y luego obtendrías resultados como estos:
Cómo instalar y configurar ALSA en Linux: Guía paso a pasoApr 2 03:45:07 smatteso-vm1 sshd[16278]: Connection closed by 10.1.7.101
Apr 2 03:46:42 smatteso-vm1 su: pam_unix(su-l:session): session opened for user phxinst1 by (uid=0)
Apr 2 03:46:45 smatteso-vm1 su: pam_unix(su-l:session): session closed for user phxinst1
Apr 2 03:46:45 smatteso-vm1 su: pam_unix(su-l:session): session opened for user phxinst1 by (uid=0)
Por supuesto, puedes combinar cadenas, como -v y -n:
grep -v -n failure /var/log/secure
Consejos rápidos para la navegación de directorios en Linux: cd y pushdLo cual te mostraría todas las entradas que no coinciden con su número de línea asociado:
1:Apr 2 03:45:07 smatteso-vm1 sshd[16278]: Connection closed by 10.1.7.101
2:Apr 2 03:46:42 smatteso-vm1 su: pam_unix(su-l:session): session opened for user phxinst1 by (uid=0)
3:Apr 2 03:46:45 smatteso-vm1 su: pam_unix(su-l:session): session closed for user phxinst1
4:Apr 2 03:46:45 smatteso-vm1 su: pam_unix(su-l:session): session opened for user phxinst1 by (uid=0)
5:Apr 2 03:46:48 smatteso-vm1 su: pam_unix(su-l:session): session closed for user phxinst1
Cómo configurar y optimizar el enrutamiento estático en Linux
7. Buscar en varios archivos
Grep puede hacer mucho más que solo buscar el contenido de un archivo específico. Puedes usar lo que se conoce como búsqueda recursiva para abarcar directorios enteros, subdirectorios o todo el sistema de archivos, y obtener resultados que muestren cada nombre de archivo que contiene tu valor de búsqueda.
Esto se logra usando el interruptor -r, que usaré para buscar mi nombre de cuenta de usuario en el directorio /etc:
grep -r "smatteso" /etc
Aquí tienes un ejemplo de los resultados:
/etc/hosts:10.1.52.237 smatteso-vm1.dwi.testdomain.com smatteso-vm1
/etc/sysconfig/network-scripts/ifcfg-eth0:HOSTNAME="smatteso-vm1"
Cómo utilizar select() y poll() para multiplexar sockets de red/etc/sysconfig/rhn/systemid:<value><string>smatteso-vm1.dwi.testdomain.com</string></value>
/etc/sysconfig/network:HOSTNAME=smatteso-vm1
Puedes buscar en todo el sistema de archivos cambiando ese "/etc" a "/":
grep -r "smatteso" /
(ten en cuenta que esto puede ser una operación que consume mucho tiempo).
8. Mostrar solo los nombres de archivo que coinciden con la búsqueda
No me gusta el desorden, así que para obtener solo la lista de nombres de archivo que coinciden con mi búsqueda (y no el contenido de los archivos en sí), puedo agregar el interruptor -l:
Cómo convertir una caja de Linux en un router OSPF y BGPgrep -rl "smatteso" /etc
Esto devolvería resultados como estos:
/etc/hosts
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/rhn/systemid
/etc/sysconfig/network
Como se discutió anteriormente, puedes invertir esto para mostrar los nombres de archivo que no contienen el término de búsqueda, usando el interruptor -L en lugar de -l:
grep -rL "smatteso" /etc
9. Buscar mensajes registrados por fecha
Un elemento especialmente útil al usar grep es buscar a través de archivos de registro en busca de mensajes que se registraron en una fecha determinada. Digamos que quiero ver todo lo registrado el 5 de abril:
grep "Apr 5" /var/log/messages
Obtendría resultados como estos:
Apr 5 00:00:01 smatteso-vm1 audispd: node=smatteso-vm1 type=USER_ACCT msg=audit(1491364801.741:135867): user pid=50149 uid=0 auid=4294967295 ses=4294967295 msg='op=PAM:accounting acct="phxinst1" exe="/usr
/sbin/crond" hostname=? addr=? terminal=cron res=success'
Apr 5 00:00:01 smatteso-vm1 audispd: node=smatteso-vm1 type=USER_ACCT msg=audit(1491364801.741:135866): user pid=50143 uid=0 auid=4294967295 ses=4294967295
Esto también funciona para un periodo de tiempo específico si lo agregas, por supuesto. Para ver solo los mensajes registrados a las 6 a.m., puedo agregar "06:00" al comando:
grep "Apr 5 06:00" /var/log/messages
Apr 5 06:00:01 smatteso-vm1 audispd: node=smatteso-vm1 type=USER_ACCT msg=audit(1491386401.774:143444): user pid=33946 uid=0 auid=4294967295 ses=4294967295 msg='op=PAM:accounting acct="phxinst1" exe="/usr/sbin/crond" hostname=? addr=? terminal=cron res=success'
Apr 5 06:00:01 smatteso-vm1 audispd: node=smatteso-vm1 type=USER_ACCT msg=audit(1491386401.774:143445): user pid=33945 uid=0 auid=4294967295 ses=4294967295 msg='op=PAM:accounting acct="phxinst1" exe="/usr/sbin/crond" hostname=? addr=? terminal=cron res=success'
10. Usar grep con otros comandos
Grep se puede usar con cualquier otro comando que desees. Digamos que quiero encontrar cualquier archivo de registro que contenga la palabra "spice". Puedo usar el comando "find" y redireccionar los resultados a grep de la siguiente manera:
find . -name "*.log" | grep -i spice
Esto es un ejemplo de los resultados:
./spice-vdagent.log
El archivo de historial, que contiene una lista de comandos escritos recientemente, es uno de los mejores elementos de Linux. También es posible buscar en el archivo de historial términos específicos (por ejemplo, "pam_tally2") para ver cuándo se usaron por última vez y cuál es la sintaxis adecuada:
history | grep pam_tally2
324 2017-04-06 13:50:25 pam_tally2
325 2017-04-06 13:50:29 pam_tally2 -u smatteso -r
350 2017-04-06 14:05:44 history | grep pam_tally2
Puedes usar grep con "netstat" para ver los puertos en escucha, por ejemplo, el puerto 22:
netstat -anp | grep 22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2154/sshd
tcp 0 0 10.1.52.237:22 10.1.13.63:51704 ESTABLISHED 40441/sshd
tcp 0 32 10.1.52.237:22 10.1.13.63:51701 ESTABLISHED 40434/sshd
tcp 0 0 :::22 :::* LISTEN 2154/sshd
ps -aux | grep spice
root 2179 0.0 0.0 15900 1076 ? Ss Mar31 0:00 /usr/sbin/spice-vdagentd
root 2855 0.0 0.0 103328 888 pts/0 S+ 12:41 0:00 grep spice
gdm 5430 0.0 0.0 34488 1604 ? Ss Mar31 0:00 /usr/bin/spice-vdagent
Esto es solo la punta básica del iceberg que representa las capacidades de grep. En un artículo posterior, discutiré algunos métodos más avanzados para usar el comando y obtener resultados aún más útiles y detallados.
Para obtener más información sobre grep, usa el comando "man grep" o "grep --help". También puedes descargar una versión de grep para Windows.
También te puede interesar
- Cómo liberar espacio en disco en sistemas Linux
- Cómo redimensionar una partición virtual de Red Hat Enterprise Linux
- Cómo agregar control de versiones al directorio /etc en Linux
- Cómo usar una ramdisk en Linux
En Newsmatic nos especializamos en tecnología de vanguardia, contamos con los artículos mas novedosos sobre Código abierto, allí encontraras muchos artículos similares a 10 ejemplos de uso del comando grep en Linux para buscar archivos y contenido , tenemos lo ultimo en tecnología 2023.
Artículos Relacionados