GNU/Linux >> Tutoriales Linux >  >> Linux

Comando Grep en Linux (con ejemplos)

En este tutorial, aprenderá cómo usar el muy esencial grep Comando en Linux. Vamos a repasar por qué es importante dominar este comando y cómo puede utilizarlo en sus tareas diarias en la línea de comando.

Empecemos con algunas explicaciones y ejemplos.

¿Por qué usamos grep?

Grep es una herramienta de línea de comandos que los usuarios de Linux utilizan para buscar cadenas de texto. Puede usarlo para buscar en un archivo una determinada palabra o combinación de palabras, o puede canalizar la salida de otros comandos de Linux a grep, de modo que grep pueda mostrarle solo la salida que necesita ver.

Veamos algunos ejemplos muy comunes. Digamos que necesita verificar el contenido de un directorio para ver si existe un determinado archivo allí. Eso es algo para lo que usaría el comando "ls".

Pero, para que todo este proceso de verificar el contenido del directorio sea aún más rápido, puede canalizar la salida del comando ls al comando grep. Busquemos en nuestro directorio de inicio una carpeta llamada Documentos.

Y ahora, intentemos verificar el directorio nuevamente, pero esta vez usando grep para verificar específicamente la carpeta Documentos.

$ ls | grep Documents

Como puede ver en la captura de pantalla anterior, usar el comando grep nos ahorró tiempo al aislar rápidamente la palabra que buscamos del resto de la salida innecesaria que produjo el comando ls.

Si la carpeta Documentos no existiera, grep no devolvería ningún resultado. Entonces, si grep no devuelve nada, eso significa que no pudo encontrar la palabra que está buscando.

Buscar una cadena

Si necesita buscar una cadena de texto, en lugar de una sola palabra, deberá envolver la cadena entre comillas. Por ejemplo, ¿qué pasaría si necesitáramos buscar el directorio "Mis documentos" en lugar del directorio "Documentos" de una sola palabra?

$ ls | grep 'My Documents'

Grep aceptará tanto comillas simples como dobles, así que ajuste su cadena de texto con cualquiera.

Si bien puede usar grep para buscar la salida canalizada desde otras herramientas de línea de comandos, también puede usarla para buscar documentos directamente. Este es un ejemplo en el que buscamos una cadena en un documento de texto.

$ grep 'Class 1' Students.txt

Buscar múltiples cadenas

También puede usar grep para buscar varias palabras o cadenas. Puede especificar varios patrones utilizando el modificador -e. Intentemos buscar en un documento de texto dos cadenas diferentes:

$ grep -e 'Class 1' -e Todd Students.txt

Tenga en cuenta que solo necesitábamos usar comillas alrededor de las cadenas que contenían espacios.

Diferencia entre grep, egrep fgrep, pgrep, zgrep

Históricamente, se incluyeron varios conmutadores grep en diferentes binarios. En los sistemas Linux modernos, encontrará estos conmutadores disponibles en el comando base grep, pero es común ver que las distribuciones también admiten otros comandos.

Desde la página del manual para grep:

egrep es el equivalente de grep -E

Este modificador interpretará un patrón como una expresión regular extendida. Hay un montón de cosas diferentes que puede hacer con esto, pero aquí hay un ejemplo de cómo se ve usar una expresión regular con grep.

Busquemos en un documento de texto cadenas que contengan dos letras 'p' consecutivas:

$ egrep p\{2} fruits.txt

o

$ grep -E p\{2} fruits.txt

fgrep es el equivalente de grep -F

Este modificador interpretará un patrón como una lista de cadenas fijas e intentará hacer coincidir cualquiera de ellas. Es útil cuando necesita buscar caracteres de expresión regular. Esto significa que no tiene que escapar de los caracteres especiales como lo haría con grep normal.

pgrep es un comando para buscar el nombre de un proceso en ejecución en su sistema y devolver sus respectivos ID de proceso. Por ejemplo, podría usarlo para encontrar el ID de proceso del demonio SSH:

$ pgrep sshd

Esto es similar en función a simplemente canalizar la salida del comando 'ps' a grep.

Puede usar esta información para eliminar un proceso en ejecución o solucionar problemas con los servicios que se ejecutan en su sistema.

Puede usar zgrep para buscar un patrón en archivos comprimidos. Le permite buscar los archivos dentro de un archivo comprimido sin tener que descomprimir primero ese archivo, básicamente ahorrándole uno o dos pasos adicionales.

$ zgrep apple fruits.txt.gz

zgrep también funciona en archivos tar, pero solo parece ir tan lejos como para decirle si pudo o no encontrar una coincidencia.

Mencionamos esto porque los archivos comprimidos con gzip suelen ser archivos tar.

Diferencia entre buscar y grep

Para aquellos que recién comienzan con la línea de comandos de Linux, es importante recordar que find y grep son dos comandos con dos funciones muy diferentes, aunque usamos ambos para "encontrar" algo que el usuario especifica.

Es útil usar grep para encontrar un archivo cuando lo usa para buscar a través de la salida del comando ls como mostramos en los primeros ejemplos del tutorial.

Sin embargo, si necesita buscar recursivamente el nombre de un archivo, o parte del nombre del archivo si usa un comodín (asterisco), está muy adelantado para usar el comando 'buscar'.

$ find /path/to/search -name name-of-file

El resultado anterior muestra que el comando de búsqueda pudo ubicar con éxito el archivo que buscamos.

Buscar recursivamente

Puede usar el modificador -r con grep para buscar recursivamente a través de todos los archivos en un directorio y sus subdirectorios para un patrón específico.

$ grep -r pattern /directory/to/search

Si no especifica un directorio, grep solo buscará en su directorio de trabajo actual. En la captura de pantalla a continuación, grep encontró dos archivos que coinciden con nuestro patrón y regresa con sus nombres de archivo y en qué directorio residen.

Espacio de captura o pestaña

Como mencionamos anteriormente en nuestra explicación de cómo buscar una cadena, puede envolver el texto entre comillas si contiene espacios. El mismo método funcionará para las pestañas, pero explicaremos cómo colocar una pestaña en su comando grep en un momento.

Coloque un espacio o varios espacios entre comillas para que grep busque ese carácter.

$ grep " " sample.txt

Hay algunas formas diferentes de buscar una pestaña con grep, pero la mayoría de los métodos son experimentales o pueden ser inconsistentes entre diferentes distribuciones.

La forma más fácil es simplemente buscar el carácter de tabulación en sí, que puede producir presionando ctrl+v en su teclado, seguido de tabulación.

Normalmente, presionar la pestaña en una ventana de terminal le dice a la terminal que desea completar automáticamente un comando, pero presionar la combinación ctrl + v de antemano hará que el carácter de tabulación se escriba como normalmente esperaría en un editor de texto .

$ grep "    " sample.txt

Conocer este pequeño truco es especialmente útil cuando se revisan los archivos de configuración en Linux, ya que las pestañas se usan con frecuencia para separar los comandos de sus valores.

Uso de expresiones regulares

La funcionalidad de Grep se amplía aún más mediante el uso de expresiones regulares, lo que le permite una mayor flexibilidad en sus búsquedas. Existen varios, y repasaremos algunos de los más comunes en los siguientes ejemplos:

[ ] corchetes se utilizan para hacer coincidir cualquiera de un conjunto de caracteres.

$ grep "Class [123]" Students.txt

Este comando devolverá cualquier línea que diga 'Clase 1', 'Clase 2' o 'Clase 3'.

[-] corchetes con guión se puede utilizar para especificar un rango de caracteres, ya sea numérico o alfabético.

$ grep "Class [1-3]" Students.txt

Obtenemos el mismo resultado que antes, pero el comando es mucho más fácil de escribir, especialmente si tenemos un mayor rango de números o letras.

^ intercalación se utiliza para buscar un patrón que solo aparece al principio de una línea.

$ grep "^Class" Students.txt

[^] corchetes con intercalación se utilizan para excluir caracteres de un patrón de búsqueda.

$ grep "Class [^1-2]" Students.txt

signo de dólar $ se utiliza para buscar un patrón que solo aparece al final de una línea.

$ grep "1$" Students.txt

. punto se usa para hacer coincidir cualquier carácter, por lo que es un comodín pero solo para un solo carácter.

$ grep "A….a" Students.txt

Archivos Grep gz sin descomprimir

Como mostramos anteriormente, puede usar el comando zgrep para buscar archivos comprimidos sin tener que descomprimirlos primero.

$ zgrep word-to-search /path/to/file.gz

También puede usar el comando zcat para mostrar el contenido de un archivo gz y luego canalizar esa salida a grep para aislar las líneas que contienen su cadena de búsqueda.

$ zcat file.gz | grep word-to-search

Grep direcciones de correo electrónico desde un archivo zip

Podemos usar una elegante expresión regular para extraer todas las direcciones de correo electrónico de un archivo zip.

$ grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' emails.txt

El indicador -o extraerá la dirección de correo electrónico solo , en lugar de mostrar la línea completa que contiene la dirección de correo electrónico. Esto da como resultado una salida más limpia.

Como con la mayoría de las cosas en Linux, hay más de una forma de hacer esto. También podría usar egrep y un conjunto diferente de expresiones. Pero el ejemplo anterior funciona bien y es una forma bastante sencilla de extraer las direcciones de correo electrónico e ignorar todo lo demás.

Direcciones IP de grupo

Buscar direcciones IP puede ser un poco complejo porque no podemos simplemente decirle a grep que busque cuatro números separados por puntos; bueno, podríamos. pero ese comando también tiene el potencial de devolver direcciones IP no válidas.

El siguiente comando encontrará y aislará solo direcciones IPv4 válidas:

$ grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" /var/log/auth.log

Usamos esto en nuestro servidor Ubuntu solo para ver desde dónde se han realizado los últimos intentos de SSH.

Para evitar la repetición de información y evitar que inunde su pantalla, es posible que desee canalizar sus comandos grep a "uniq" y "más", como hicimos en la captura de pantalla anterior.

Grep o condición

Hay algunas formas diferentes de usar una condición o con grep, pero le mostraremos la que requiere la menor cantidad de pulsaciones de teclas y es la más fácil de recordar:

$ grep -E 'string1|string2' filename

o, técnicamente, usar egrep requiere incluso menos pulsaciones de teclas:

$ egrep 'string1|string2' filename

Ignorar mayúsculas y minúsculas

De forma predeterminada, grep distingue entre mayúsculas y minúsculas, lo que significa que debe ser preciso en las mayúsculas de su cadena de búsqueda. Puede evitar esto diciéndole a grep que ignore el caso con el modificador -i.

$ grep -i string filename

Buscar con distinción entre mayúsculas y minúsculas

¿Qué pasa si queremos buscar una cadena donde la primera puede estar en mayúsculas o minúsculas, pero el resto de la cadena debe estar en minúsculas? Ignorar mayúsculas y minúsculas con el interruptor -i no funcionará en este caso, por lo que una forma sencilla de hacerlo sería con corchetes.

$ grep [Ss]tring filename

Este comando le dice a grep que distinga entre mayúsculas y minúsculas excepto la primera letra.

Grep coincidencia exacta

En nuestros ejemplos anteriores, cada vez que buscamos en nuestro documento la cadena "manzana", grep también devuelve "piña" como parte de la salida. Para evitar esto y buscar estrictamente "manzana", puede usar este comando:

$ grep "\<apple\>" fruits.txt

También puede usar el modificador -w, que le indicará a grep que la cadena debe coincidir con toda la línea. Obviamente, esto solo funcionará en situaciones en las que no espera que el resto de la línea tenga ningún texto.

Excluir patrón

Para ver el contenido de un archivo pero excluir patrones de la salida, puede usar el modificador -v.

$ grep -v string-to-exclude filename

Como puede ver en la captura de pantalla, la cadena que excluimos ya no se muestra cuando ejecutamos el mismo comando con el modificador -v.

Grep y reemplazar

Se puede usar un comando grep canalizado a sed para reemplazar todas las instancias de una cadena en un archivo. Este comando reemplazará "cadena1" con "cadena2" en todos los archivos relativos al directorio de trabajo actual:

$ grep -rl 'string1' ./ | xargs sed -i 's/string1/string2/g'

Grep con número de línea

Para mostrar el número de línea que contiene su cadena, use el modificador -n:

$ grep -n string filename

Mostrar líneas antes y después

Si necesita un poco más de contexto para la salida de grep, puede mostrar una línea antes y después de la cadena de búsqueda especificada con el modificador -c:

$ grep -c 1 string filename

Especifique la cantidad de líneas que desea mostrar:solo hicimos 1 línea en este ejemplo.

Ordenar el resultado

Canalice la salida de greps al comando sort para clasificar sus resultados en algún tipo de orden. El valor predeterminado es alfabético.

$ grep string filename | sort

Espero que encuentres útil el tutorial. Sigue regresando.


Linux
  1. Comando wc Linux con ejemplos

  2. Comando de clasificación de Linux con ejemplos

  3. Comando Linux Tee con ejemplos

  4. Comando de cabeza de Linux con ejemplos

  5. Comando JQ en Linux con ejemplos

15 comandos ps de Linux con ejemplos

Comando de CD de Linux con ejemplos

Comando de vigilancia de Linux con ejemplos

Comando de espera en Linux con ejemplos

Comando de exportación de Linux con ejemplos

Comando IP de Linux con ejemplos