![AWK: "bucle for" dentro de la impresión de una nueva línea](https://rvso.com/image/154449/AWK%3A%20%22bucle%20for%22%20dentro%20de%20la%20impresi%C3%B3n%20de%20una%20nueva%20l%C3%ADnea.png)
Estoy buscando cómo poner el bucle for dentro de "imprimir". He logrado obtener toda la información que necesito del archivo de registro, pero si uso el "bucle for" después de imprimir, cada nueva información se proporciona en una nueva línea. Sé que se llama imprimir cada vez, así que... ¿cómo imprimir todo en una nueva línea? Por ejemplo este:
cat /var/log/apache2/domlogs/xxxx/xxxx.com* | awk -F " " '{print $1 " - " $4 " " $5 " "} {for(i=12; i<=NF; i++) print $i}'
Dame esa salida:
66.249.65.172 - [29/May/2019:02:48:20 +0200]
"Mozilla/5.0
(compatible;
Googlebot/2.1;
+http://www.google.com/bot.html)"
Pero cuando quiero pasar al final lo que encontré entre 12 col y NF:
cat /var/log/apache2/domlogs/xxxx/xxxx.com* | awk -F " " '{print $1 " - " $4 " " $5 " " for(i=12; i<=NF; i++) " " $i}'
Entonces solo obtengo:
66.249.65.172 - [29/May/2019:02:48:20 +0200]
Me dirijo a una salida como:
66.249.65.172 - [29/May/2019:02:48:20 +0200] "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Respuesta1
Debe utilizar printf()
over print
porque este último incorpora de forma predeterminada una nueva línea después de la cadena proporcionada. Modifique su código para usarlo printf
con especificadores de formato para cada una de las cadenas.
awk '{ printf "%s - %s %s ", $1, $4, $5 }
{ for(i=12; i<=NF; i++) printf "%s ", $i; printf "\n" }'