Awk, пишущий сценарий справки

Эй парни, плохо знакомые со сценариями и надеющийся видеть, почему я получаю следующее сообщение об ошибке:

syntax error near unexpected token '$0'

использование этого .sh файл для реконструкции даты и времени в a .txt файл так, чтобы были удалены определенные символы.

У меня есть awk.sh файл, который содержит:

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])

Просто не уверенный, почему я получаю это сообщение

Файл log.txt содержит:

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)"  

Таким образом, то, что я пытаюсь сделать, отобразить 2-й столбец (дата и время) в .txt файле как:

10 December 2012 04:14:15 

не как показано выше, так в значительной степени избавьтесь от наклонных черт вправо, двоеточие, промежуточное дата и время, и также удалите +0100]

Не знайте то, что я делаю неправильно

0
задан 15 April 2014 в 05:29

3 ответа

В первую очередь, для выполнения awk сценарии, необходимо использовать awk интерпретатор. Можно или сделать это на командной строке непосредственно (awk '{print $2}' file), или можно создать awk сценарий. То, что необходимо, должно так или иначе принести awk в уравнение. Вы не можете использовать оболочку для выполнения awk команды, только awk может сделать это.

В этом случае сценарий не действительно необходим, поскольку steeldriver показал Вам, но можно также сделать это UNIX Way® и объединить инструменты:

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

Объяснение

-F опция позволяет Вам выбрать разделителя полей, в этом случае, я даю ему класс символов, который содержит два символа: [ и (пространство). Это означает это awk разделит на тех символах. Получающиеся поля будут:

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

Я поэтому печатаю 4-е поле и передаю его через sed который просто заменяет первое : с пространством (s#:# #) и все / с пробелами (все из-за g в s#/# #g).


С другой стороны, Вы могли просто переключиться на perl для всего этого:

perl -pe 's/.*?\[(.+?)\s\S+\].*/$1/; s/:/ /; s#/# #g' log.txt 
0
ответ дан 15 April 2014 в 05:29

Я все еще не не ясен точно , что Вы хотите сделать, но вероятно самый легкий подход был бы через функции замены подстроки awk sub и/или gsub, например,

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

Помнят, что по умолчанию, awk разделения на пробеле, таким образом считая пробелы любой стороной эти -, поле даты $3 не $2.

0
ответ дан 15 April 2014 в 05:29

Использование GNU sed,

sed '/hello.googlebot.com/ s/.* - \[\(.*\)\/\(.*\)\/\(.*\)\:\(.*\)\:\(.*\)\:\(.*\) .*\].*/\1 \2 \3 \4:\5:\6/g' file

Пример:

$ 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/.* - \[\(.*\)\/\(.*\)\/\(.*\)\:\(.*\)\:\(.*\)\:\(.*\) .*\].*/\1 \2 \3 \4:\5:\6/g'
10 December 2012 04:14:15
0
ответ дан 15 April 2014 в 05:29

Другие вопросы по тегам:

Похожие вопросы: