![AWK - "for loop" dentro da nova linha de impressão](https://rvso.com/image/154449/AWK%20-%20%22for%20loop%22%20dentro%20da%20nova%20linha%20de%20impress%C3%A3o.png)
Estou pesquisando como colocar o loop for dentro de "print" - consegui obter todas as informações necessárias do arquivo de log, mas se eu usar o "loop for" após a impressão, cada nova informação será fornecida em uma nova linha. Eu sei que isso chama print toda vez, então... como imprimir tudo em nova linha? Por exemplo isto:
cat /var/log/apache2/domlogs/xxxx/xxxx.com* | awk -F " " '{print $1 " - " $4 " " $5 " "} {for(i=12; i<=NF; i++) print $i}'
Dê-me essa saída:
66.249.65.172 - [29/May/2019:02:48:20 +0200]
"Mozilla/5.0
(compatible;
Googlebot/2.1;
+http://www.google.com/bot.html)"
Mas quando quero passar no final o que encontrei entre 12 col e NF:
cat /var/log/apache2/domlogs/xxxx/xxxx.com* | awk -F " " '{print $1 " - " $4 " " $5 " " for(i=12; i<=NF; i++) " " $i}'
Então eu recebo apenas:
66.249.65.172 - [29/May/2019:02:48:20 +0200]
Estou indo para uma saída 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)"
Responder1
Você precisa usar printf()
over print
porque o último, por padrão, incorpora uma nova linha após a string fornecida. Modifique seu código para usar printf
com especificadores de formato para cada uma das strings.
awk '{ printf "%s - %s %s ", $1, $4, $5 }
{ for(i=12; i<=NF; i++) printf "%s ", $i; printf "\n" }'