Ajuda de script do awk

0

Oi pessoal novo no script e procurando por que recebo a seguinte mensagem de erro:

syntax error near unexpected token '$0'

usando este arquivo .sh para reorganizar a data e a hora em um arquivo .txt para que determinados caracteres sejam excluídos.

Eu tenho um arquivo awk.sh que contém:

Match ($0 /\[(0-9]+)\/([A-Z][a-z]+)\/([0-9]+)([0-9]+:[0-9]+:[0-9]) \+[0-9]+\] matches)
printf("20%s 10%s 10%s 10%s\n",matches[1],matches[2],matches[3],matches[4])

Não sei por que recebo esta mensagem

O arquivo

log.txt contém:

hello.googlebot.com - [10/December/2012:04:14:15 +0100] "GET /plain.txt HTTP/1.0" 132 12 "-" "Googlebot/2.1 (+http://www.google.com/bot.html)"  

Então, o que estou tentando fazer é exibir a segunda coluna (data e hora) no arquivo .txt como:

10 December 2012 04:14:15 

não como mostrado acima, por isso praticamente elimina as barras, os dois pontos entre a data e a hora e também remove o +0100]

Não sei o que estou fazendo errado

    
por user268986 15.04.2014 / 00:18

3 respostas

2

Primeiro de tudo, para executar awk scripts, você precisa usar o interpretador awk . Você pode fazê-lo diretamente na linha de comando ( awk '{print $2}' file ) ou pode criar um script awk. O que é necessário é de alguma forma trazer awk para a equação. Você não pode usar o shell para executar comandos awk , somente awk pode fazer isso.

Neste caso, o script não é realmente necessário, como o Steeldriver mostrou, mas você também pode fazer o UNIX Way® e combinar ferramentas:

awk -F'[[ ]' '/hello.googlebot.com/{print $4}' log.txt | sed 's#:# #;s#/# #g'

Explicação

A opção -F permite escolher o separador de campos, neste caso, estou dando a ela uma classe de caracteres que contém dois caracteres: [ e (espaço). Isso significa que awk será dividido nesses caracteres. Os campos resultantes serão:

1 : hello.googlebot.com
2 : -
3 : 
4 : 10/December/2012:04:14:15

Por isso, imprimo o 4º campo e o passo sed que apenas substitui o primeiro : por um espaço ( s#:# # ) e todos / com espaços ( todos por causa do g em s#/# #g ).

Alternativamente, você poderia simplesmente mudar para perl para a coisa toda:

perl -pe 's/.*?\[(.+?)\s\S+\].*/$1/; s/:/ /; s#/# #g' log.txt 
    
por terdon 15.04.2014 / 03:50
1

Ainda não estou claro exatamente o que você quer fazer, mas provavelmente a abordagem mais fácil seria por meio das funções de substituição de substring do sub e / ou gsub , por exemplo,

awk '/hello.googlebot.com/ {gsub("[[/]"," ",$3); sub(":"," ",$3); print $3}' logfile

Lembre-se de que, por padrão, o awk se divide no espaço em branco, portanto, contando os espaços de cada lado do - , o campo de data é $3 não $2 .

    
por steeldriver 15.04.2014 / 03:28
0

Usando o GNU sed ,

sed '/hello.googlebot.com/ s/.* - \[\(.*\)\/\(.*\)\/\(.*\)\:\(.*\)\:\(.*\)\:\(.*\) .*\].*/   ::/g' file

Exemplo:

$ echo 'hello.googlebot.com - [10/December/2012:04:14:15 +0100] "GET /plain.txt HTTP/1.0" 132 12 "-" "Googlebot/2.1 (+http://www.google.com/bot.html)"' | sed '/hello.googlebot.com/ s/.* - \[\(.*\)\/\(.*\)\/\(.*\)\:\(.*\)\:\(.*\)\:\(.*\) .*\].*/   ::/g'
10 December 2012 04:14:15
    
por Avinash Raj 11.05.2014 / 09:05