Linux: busque archivos que contengan texto

L

Este tema es un conocimiento esencial para todos los usuarios de UNIX, Linux, Solaris, OS X y BSD. Además, la certificación LPI contiene preguntas complicadas sobre esto.

Si desea buscar archivos con un nombre de archivo determinado mediante la línea de comando, utilice el find o la locate comandos. Pero si desea encontrar archivos que contengan un texto determinado, querrá usar grep y sus amigos. Aquí, el término amigos significa un grupo de herramientas similares que se adaptan a un formato de datos específico o estructura de archivo como texto sin formato, archivos comprimidos y documentos PDF.

Esto es lo que cubriremos en este artículo:

  • Búsqueda de texto básica
  • Más opciones de grep
  • Búsqueda de archivos comprimidos
  • Búsqueda de otros tipos de documentos
  • Conclusión

Búsqueda de texto básica

El nombre grep es una combinación de las letras iniciales de las cuatro palabras “gramolobal / regular mixpresión / pagsrint “. Esto es similar a formular patrones de búsqueda en el editor de transmisiones sed. grep está diseñado para encontrar patrones acordes en flujos de datos completos (archivos). Los patrones dados se interpretan como texto o Expresiones regulares (vea a continuación un ejemplo).

El ejemplo 1 muestra cómo descubrir todas las apariciones del nombre de marca “Mikrotik” escrito como “Mikrotik” o “MikroTik”. Usamos grep para buscar en todos los archivos cuyo nombre comienza con “factura-2017”. El resultado es una lista de nombres de archivos con las coincidencias correspondientes, una por línea precedida por el nombre del archivo.

Ejemplo 1: llamar a grep con una expresión regular

$ grep Mikro[tT]ik invoice-2017*
invoice-20170015.text:Mikrotik Routerboard 750GL Gigabit Switch
invoice-20170045.text:MikroTik RouterBoard RB250GS Gigabit Switch

Esta salida es útil pero no contiene el número de línea. Para mostrar el número de línea con grep, use la opción -no --line-number como la versión larga. Entonces, el resultado es el siguiente:

Ejemplo 2: llamar a grep con una expresión regular y números de línea

$ grep -n Mikro[tT]ik invoice-2017*
invoice-20170015.text:64:Mikrotik Routerboard 750GL Gigabit Switch
invoice-20170045.text:65:MikroTik RouterBoard RB250GS Gigabit Switch

En cada línea, los campos de salida individuales están separados por dos puntos. El primer campo contiene el nombre del archivo (“factura-20170015.text”), el segundo campo es el número de línea dentro del archivo coincidente (“64”) y el tercer campo es la línea completa con el texto coincidente (“Mikrotik Routerboard 750GL Conmutador Gigabit “).

Más opciones de grep

grep tiene una larga lista de opciones útiles. Consulte la página del manual para obtener una descripción detallada. Los más relevantes para este artículo son:

Opción corta Opción larga Descripción

-yo–ignorar casoescritura en minúsculas y mayúsculas
-l–archivos-con-coincidenciasdetenerse después de la primera coincidencia y generar el nombre del archivo
-norte–número de líneamuestra el número de línea del partido
-r–recursivobuscar recursivamente
–color o –colorresaltar la coincidencia real

Con la excepción de resaltar la coincidencia real, el Ejemplo 3 combina las opciones -i, -ry -l como se describió anteriormente. Esto simplifica la llamada y devuelve una lista de archivos con coincidencias, sin importar cuántas coincidencias existan para cada archivo. Con la ayuda de esto, puede ver si hay coincidencias y, de ser así, en qué archivos.

Ejemplo 3: cómo buscar todos los archivos que contienen el término “mikrotik” en cualquier tipo de ortografía de forma recursiva

$ grep -irl mikrotik invoice-2017*
invoice-20170015.text
invoice-20170045.text

El comando grep viene con dos variantes especiales – fgrep y egrep. fgrep interpreta el patrón de búsqueda como una cadena de caracteres individuales y es exactamente igual que grep -F (y grep --fixed-strings).

A diferencia de, egrep toma el patrón como una expresión regular y es similar a grep -E (y grep --extended-regexp). En versiones anteriores de Linux anteriores a Debian 4 Etch, ambos comandos se implementan como scripts de shell que llaman grep con opciones especiales. Hoy en día, las versiones actuales de Linux mantienen los comandos como archivos binarios. En cualquier caso, la búsqueda es un poco más rápida que usar grep sin esta opción especial.

Búsqueda de archivos comprimidos

grep no puede inspeccionar los archivos comprimidos correctamente. Ahora, los especialistas nombrados zgrep, bzgrep, xzgrep y zipgrep entrar en el escenario. Estas herramientas te ayudan a simplificar comandos como este:

$ zcat archive.gz | fgrep [pattern]

zcat descomprime el archivo dado y envía su contenido a stdout. Canalizado a fgrep, el flujo de datos se busca para el dado [pattern].

Con la ayuda de los comandos anteriores, no tiene que descomprimir archivos comprimidos con gzip, bzip2, xz y zip antes de la búsqueda: este paso ocurre detrás de escena. Al igual que con grep, las variantes especiales zfgrep y zegrep para gzip existir así como bzfgrep y bzegrep para bzy xzfgrep y xzegrep para xz archivo. El ejemplo 4 muestra cómo buscar un xz-archivo comprimido.

Ejemplo 4: búsqueda de un xz-archivo comprimido

$ xzfgrep Mikrotik invoice-20130015.text.xz
Mikrotik Routerboard RB450G Level 5 680MHz

La búsqueda de archivos comprimidos es un poco más compleja y requiere un poco de scripts de shell. El Listado 1 demuestra un script de shell que solo funciona con gzip-archivos comprimidos. Para simplificar, guardamos el siguiente script con el nombre “search.sh”. El script requiere dos parámetros: el patrón de búsqueda y el nombre de archivo del archivo comprimido (consulte el Ejemplo 5 a continuación).

Listado 1: Búsqueda comprimida gzip archivo

#!/bin/bash

pattern=$1
archive=$2

for filename in $(tar -tzf "$archive");
  do
    match=$(tar -xOzf "$archive" "$filename" | fgrep "$pattern") && echo "$filename:";
    echo "$match" | fgrep --color "$pattern";
    echo "";
  done

Ejemplo 5: llamar al script

$ ./search.sh Mikro archive.tar.gz
invoice-20110045.text:
Mikrotik

invoice-20110110.text:
MikroTik

Comprender el guión puede requerir un momento. Primero, el script extrae la lista de archivos del archivo y evalúa cada archivo uno tras otro. El exterior for loop hace todo el trabajo complejo. En segundo lugar, las coincidencias individuales se guardan en la variable $match. Por lo tanto, el archivo actual se extrae del archivo comprimido y luego se canaliza a fgrep. fgrep busca en el flujo de datos e indica una coincidencia con un valor de retorno positivo. En caso de que lo siguiente echo se ejecuta el comando y el nombre del archivo se envía a stdout. En tercer lugar, también se imprime la coincidencia real, seguida de una línea vacía. Esto separa las diferentes coincidencias por archivo.

Una alternativa es la herramienta deepgrep que forma parte del motor de búsqueda de escritorio Strigi (Paquete Debian strigi-utils). Busca tar.gz archivos así como zip archivos, paquetes Debian e incluso archivos de Microsoft Word. El ejemplo 6 muestra cómo funciona. Línea por línea verá el nombre del archivo y las coincidencias correspondientes.

Ejemplo 6: búsqueda de un archivo utilizando deepgrep

$ deepgrep Mikro archive.tar.gz
archive.tar.gz/invoice-20110045.text:Mikrotik
archive.tar.gz/invoice-20110110.text:MikroTik
$

Búsqueda de otros tipos de documentos

deepgrep cubre muchos formatos de archivo pero tiene bastantes dependencias de paquetes. En su lugar, puede echar un vistazo a pdfgrep y ssgrep, en su lugar. pdfgrep está especializado en documentos PDF y ssgrep es para hojas de cálculo.

Lo que me gusta de pdfgrep es tanto su simplicidad en el uso como su variedad en términos de opciones. Las coincidencias se resaltan sin necesidad de especificar más argumentos.

La opción -n, que se muestra en uso a continuación, ayuda a identificar la página en la que se descubrió el patrón. En el Ejemplo 7, cada línea consta de tres campos de datos separados por una columna: el nombre del archivo, el número de página de la coincidencia y el texto extraído de la coincidencia. Si el terminal de salida admite colores, los campos de datos y las coincidencias se resaltan de diferentes maneras.

Ejemplo 7: búsqueda de documentos PDF

$ pdfgrep -n Mikro[tT]ik invoice*.pdf
invoice-20120033.pdf:2:MikroTik Sextant 5HnD 18dbi MIMO
invoice-20120075.pdf:1:MikroTik RouterBOARD 250GS Giga

Como se ha mencionado más arriba, ssgrep le ayuda a buscar hojas de cálculo. ssgrep abrevia “spreadsheet grep” y es parte de la Gnumérico herramienta. Como formato de archivo, tanto Open / Libre Office Calc como Gnumeric utilizan gzipXML comprimido como formato de archivo. Las versiones más recientes de Microsoft Excel también podrían funcionar, pero no lo probé. La Figura 1 muestra una hoja de cálculo de ejemplo con datos de ventas y cuatro pedidos.

_Figura 1: Ejemplo de hoja de cálculo Gnumeric_

Para identificar las celdas individuales que contienen el término “NanoStation”, ssgrep se llama con las opciones -H y -n. -H genera el nombre del archivo como el primer campo de datos, y -n agrega la ubicación: el nombre de la hoja de cálculo y la posición de la tabla. Consulte el Ejemplo 8 a continuación para ver la salida.

Ejemplo 8:

$ ssgrep -Hn "Nano[Ss]tation" orders.gnumeric
orders.gnumeric:orders!C3:5x NanoStation M5
orders.gnumeric:orders!C5:4x NanoStation M2
orders.gnumeric:orders!C6:3x NanoStation M3

Las herramientas presentadas hasta ahora son herramientas de línea de comandos. Para buscar documentos de Open / Libre Office, puede usar la herramienta gráfica llamada “loook” (paquete Debian loook). La Figura 2 muestra la sencilla interfaz gráfica de usuario.

_Figura 2: La interfaz gráfica de loook_

Conclusión

La búsqueda de formatos de datos es compleja y puede ser una historia interminable. Varias herramientas le ayudan a identificar fácilmente los archivos relevantes. Para obtener una lista completa de comandos para otros formatos de datos, eche un vistazo a las referencias dadas a continuación.

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con tus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad