Tengo un archivo de registro que necesito «replay» en el servidor.

Contiene entradas como esta:

Request:
        query: EXEC prc_insert_customer
        @param0: 110040851
        @param1: 137463
        @param2: [email protected].com
        @param3: John
        @param4: Smith
        @param5: Some address
        @param6:
        @param7:
        @param8: Some city
        @param9: GBR
        @param10: POSTCODE
        @param11: (555) 123-45-67
Response:

...

Que necesito para convertir cada fragmento como que en

EXEC prc_insert_customer '110040851', '137463',  ..., '(555) 123-45-67'

Traté de usar awk para que:

/EXEC prc_insert_customer/ {
        str = "EXEC prc_insert_customer";
}

str && /@param/ {
        if ($1 == "@param0:")
                sep = ""
        else
                sep = ","
        str = ((str) (sep) " '"($2) ("'"))
}

/^Response/ {
        if (str)
                print str
        str = ""
}

pero el resultado que se obtiene es:

', '(555)'DE', '', 'Some', 'GBR0851

¿Cómo puedo obtener la salida correcta?

Yo uso GNU Awk 4.0.0 en Fedora 17.

InformationsquelleAutor Quassnoi | 2012-06-06

2 Comentarios

  1. 2

    Si los archivos de registro basados en Windows, entonces es casi seguro que lidiar con los efectos secundarios (afecta? ;->) de la mal ^M char. Puede rockera producir problemas como el que describes.

     sub(/^M/,"", $0)

    debe ayudar.

    Eso es una verdadera Ctrl-M char y no 2 chars’^’,’M’, producido en un vi compatible con editor pulsando Ctrl-V y el Ctrl-M.

    Espero que esto ayude.

    • Yo uso la sub(/\r/, "", $0) así que usted no tiene un desordenado salto de línea en el script. Usted podría también utilizar /\015/.
  2. 2

    Una ligera variación de este fragmento de código que se va a hacer el truco:

    BEGIN { processing = 0 }
    /^Request/ { processing = 1 }
    /^Response/ { processing = 0 }
    
    {
        if (! processing)
            next
    
        if ($1 ~ /^@param/)
        {
            sep = ($1 == "@param0:" ? "" : ", ")
            rest = "'"
            for (i = 2; i <= NF; ++i)
                rest = rest (i == 2 ? "" : " ") $i
            rest = rest "'"
    
            str = str sep rest
        }
        else if (str != "")
        {
            print "EXEC prc_insert_customer", str
            str = ""
        }
    }

    Esto imprime para mí:

     EXEC prc_insert_customer '110040851', '137463', '[email protected]', 'John', 'Smith', 'Some address', '', '', 'Some city', 'GBR', 'POSTCODE', '(555) 123-45-67'

    Probado con awk version 20070501 y GNU Awk 4.0.0 en Mac OSX.

    • Se registra salidas de las líneas seguidas por , (555)123-45-67omstomer 110040851
    • Después de la edición, la salida cambiado ligeramente: ', '(555)123-45-67tyomer '110040851. Todavía se antepone con el registro de las líneas.
    • Parece que no hay manera de evitar la impresión de líneas de entrada cuando se utiliza el conveniente /from/, /to/ sintaxis.
    • La nueva versión se imprime nada para mí. Que awk versión estás usando?
    • He probado con awk version 20070501 y GNU Awk 4.0.0 y recibir resultados consistentes cuando se invoca así: awk -f test.awk < input.txt.
    • Si me muevo /^Response/ bloque después de la incondicional bloque comienza a trabajar, sin embargo, todavía salidas ', ' (555) 123-45-67tyer ' 110040851. Algo muy extraño está sucediendo aquí. Podría usted por favor enviar codificados en base64 de entrada y de secuencia de comandos?

Dejar respuesta

Please enter your comment!
Please enter your name here