2008/9/26 M. Rodrigo Monteiro <[EMAIL PROTECTED]> > 2008/9/26 Fabiano Caixeta Duarte <[EMAIL PROTECTED]>: > > 2008/9/26 M. Rodrigo Monteiro <[EMAIL PROTECTED]> > > > >> Senhores, bom dia. > >> > >> Tenho o seguinte script: > >> > >> #!/bin/bash > >> > >> log="${1}" > >> > >> while read line ; do > >> date=$(echo "${line}" | awk '{print $1}' | cut -d'.' -f1 | perl > >> -pe 's/\d+/localtime($&)/e') > >> date=$(date -d "${date}" +"%F %T") > >> duration=$(echo "${line}" | awk '{print $2}') > >> clientAddress=$(echo "${line}" | awk '{print $3}') > >> resultCode=$(echo "${line}" | awk '{print $4}') > >> bytes=$(echo "${line}" | awk '{print $5}') > >> requestMethod=$(echo "${line}" | awk '{print $6}') > >> url=$(echo "${line}" | awk '{print $7}' | awk -F'http://' '{print $2}') > >> rfc931=$(echo "${line}" | awk '{print $8}') > >> hierarchyCode=$(echo "${line}" | awk '{print $9}') > >> type=$(echo "${line}" | awk '{print $10}') > >> echo "insert into squidReport (code, date, duration, > >> clientAddress, resultCode, bytes, requestMethod, url, rfc931, > >> hierarchyCode, type) values ('', \"${date}\", ${duration}, > >> INET_ATON('${clientAddress}'), \"${resultCode}\", ${bytes}, > >> \"${requestMethod}\", \"${url}\", \"${rfc931}\", \"${hierarchyCode}\", > >> \"${type}\");" > >> done < "${log}" > >> > >> > >> Eu sei que essa não é nem de longe a melhor forma de fazer isso, por > >> isso quero a ajuda dos senhores para que eu possa ter o mesmo > >> resultado desse script, só mais rápido. > >> Coloquei esse script para executar em um arquivo de log do Squid (400 > >> MB, com 1656966 linhas), aí já viu né... passou a noite toda rodando e > >> não terminou. > >> > >> Tentei fazer direto no AWK, mas não tive sucesso. Parei no seguinte > erro: > >> awk: lin. de com.:2: (FILENAME=- FNR=7648) fatal: impossível abrir > >> pipe `date -d'Wed Sep 24 07:42:04 2008' +'%F %T'' (Muitos arquivos > >> abertos) > >> > >> Abraços, > >> > >> > >> M. Rodrigo Monteiro > >> [EMAIL PROTECTED] > >> "Free as in Freedom, not free as in free beer" > >> Linux User # 403730 > >> > > > > Mister M, > > > > Faço duas sugestões: > > > > 1) O formato de saída pode ser um formato aceito pelo seu banco para > > importação ao invés de precisar gerar tantos inserts. > > 2) Dispense o perl na conversão de timestamp para data. Você pode usar > > somente o date para isto. Veja um exemplo: > > > > date -d @$(head -1 access.log | awk '{print $1}') +"%F %T" > > Não sabia que poderia ser feito desse jeito... interessante. Só não > entendi o @...?
Retirado de info date: If you precede a number with `@', it represents an internal time stamp as a count of seconds. The number can contain an internal decimal point (either `.' or `,'); any excess precision not supported by the internal representation is truncated toward minus infinity. Such a number cannot be combined with any other date item, as it specifies a complete time stamp. O resto é só a concatenação do caracter @ com o retorno da substituição de comando. -- Fabiano Caixeta Duarte Especialista em Redes de Computadores Linux User #195299 Ribeirão Preto - SP [As partes desta mensagem que não continham texto foram removidas]