Outra solução é analisar o log:
function consume(pat) {
sub(/^[ \t]+/, "") # strip leading whitespace
if (!match($0, pat)) return
s = substr($0, p, RLENGTH) # extract part matching regex pattern
$0 = substr($0, RSTART + RLENGTH + 1) # strip matched part
return s
}
BEGIN {
# regular expressions to match ...
nonblank = "[^ \t]+" # a sequence of non-whitespace characters
quoted_string = "\"[^\"]+\"" # a ""-quoted string
bracketed_string = "\[[^]]+\]" # a []-quoted string
}
{ print
array["ip"] = consume(nonblank)
array["identity"] = consume(nonblank)
array["userid"] = consume(nonblank)
array["time"] = consume(bracketed_string)
array["request"] = consume(quoted_string)
array["status"] = consume(nonblank)
array["size"] = consume(nonblank)
array["referer"] = consume(quoted_string)
array["agent"] = consume(quoted_string)
for (key in array) printf " %10s: %s\n", key, array[key]
}
Observe que as cotações incorporadas eliminarão o analisador. Há outras melhorias a serem feitas, mas espero que você tenha a idéia.
No entanto, acho que, se você precisar de mais energia, seria melhor verificar analisadores de arquivos de log dedicados ou uma linguagem de script mais eficiente. Por exemplo, o Perl tem um módulo Text :: Balanced que pode extrair strings citadas e entre colchetes, e geralmente faz A Coisa Certa com citações embutidas e outras dificuldades. (BTW, um script em Perl usando Text :: Balanced seria muito semelhante ao acima!)