Script de Unix para buscar dentro de un archivo comprimido .gz archivo

Quiero conseguir un par de líneas de un archivo que está en un archivo comprimido .gz archivo.

El .gz archivo contiene muchos archivos txt y quiero buscar una cadena en todos estos archivos txt y la necesidad de obtener la previa 3 línea de producción, incluyendo la línea actual (donde la cadena de búsqueda está presente).

Traté de zgrep y consiguió el número de la línea, pero cuando uso head o tail comando está dando algunos valores de basura. Creo que no podemos usar el head o tail comandos con archivos comprimidos que contienen varios archivos.

Por favor, sugiera si hay alguna forma más sencilla?

  • Es posible cambiar el título de este modo que es claro que esa es una .tar.gz. ¿Quieres las tres líneas anteriores en un solo archivo, o bien si se informa de una línea de froma archivo anterior?
  • tres líneas anteriores de un archivo/el mismo archivo
  • Los archivos Zip != tar-bolas. Por favor, corrija el texto.
InformationsquelleAutor CFUser | 2010-11-11

2 Kommentare

  1. 5

    La esencia de la forma de lograr esto es para obtener los nombres de los archivos dentro del archivo tar para buscar y extraer su contenido a la búsqueda, aunque no es la extracción de cualquier otra cosa. Porque no queremos escribir en el sistema de archivos, podemos usar el -O bandera en lugar de extracto estándar de salida.

    tar -tzf file.tar.gz | grep '\.txt' | xargs tar -Oxzf file.tar.gz | grep -B 3 "string-or-regex" va a concatenar todos los archivos en el .tar.gz con nombres que terminan en «.txt», y grep ellos para la cadena dada, también la salida de los 3 líneas anteriores. No le dirá que el archivo en el archivo de cualquier partido venía, y el «tres líneas» puede, de hecho, vienen de la versión anterior del archivo.

    Usted puede en lugar de hacer:

    for file in $(tar -tzf file.tar.gz | grep '\.txt'); do 
        tar -Oxzf file.tar.gz "$file" | grep -B 3 --label="$file" -H "string-or-regex"
    done

    que respeten archivo de límites, y el informe de los nombres de archivo, pero es mucho menos eficiente.

    (-z dice tar es gzip comprimido. -t enumera el contenido. -x extractos. -O redirige la salida estándar en lugar de la del sistema de archivos. Mayores tars no puede tener la -O o -z de la bandera, y se desea que las banderas sin -: por ejemplo,tar tz file.tar.gz)

    Bueno, por lo que tienen un inservible grep. Podemos arreglar esto con awk!

    #!/usr/bin/awk -f
    BEGIN { context=3; }
    { add_buffer($0) }
    /pattern/ { print_buffer() }
    function add_buffer(line)
    {
        buffer[NR % context]=line
    }
    function print_buffer()
    {
        for(i = max(1, NR-context+1); i <= NR; i++) {
            print buffer[i % context]
        }
    }
    function max(a,b)
    {
        if (a > b) { return a } else { return b }
    }

    Este no se unan adyacentes partidos, a diferencia de grep -B, y por lo tanto puede repetir las líneas que
    están dentro de 3 líneas de los dos partidos diferentes.

    • Admite -C? Esto es un problema para obtener 3 líneas después así?
    • por desgracia no C así 🙁
    • Sin -B apoyo en grep, tendrás que utilizar awk, sed o Perl para mantener una ventana móvil de líneas de salida cuando su partido se encuentra. GNU tar apoya --wildcards que hace que la primera tar|grep en cada una de las versiones innecesarias. Otras versiones de tar puede o no puede apoyar esta expansión y puede o no requerir de un interruptor para activarlo.
    • Como el tiempo que quieras GNU tar, ¿por Qué no sólo tiene que instalar GNU coreutils y uso gtar/ggrep? Pero en general, me gusta el awk respuesta =).
  2. 0

    Es que tal vez un gzip de un archivo tar? La más sencilla es simplemente extraer la totalidad de la cosa y el uso regular de las herramientas en los archivos extraídos.

    • sí, es la compresión de un archivo tar. No puedo Extraer, bcoz contiene archivos de Gran tamaño y recibirá problemas de espacio de Disco

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea