Linux: busque archivos que contengan texto

    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.

    Etiquetas:

    Deja una respuesta

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