Привет, ребята, новички в написании сценариев и посмотрите, почему я получаю следующее сообщение об ошибке:
syntax error near unexpected token '[110]'
, используя этот файл .sh
, чтобы переставить дату и время в файле .txt
, чтобы определенные символы удаляются.
У меня есть файл awk.sh, который содержит:
Match ([111] /\[(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]
Не знаю, что я делаю неправильно
Я все еще не не ясен точно , что Вы хотите сделать, но вероятно самый легкий подход был бы через функции замены подстроки awk sub
и/или gsub
, например,
awk '/hello.googlebot.com/ {gsub("[[/]"," ",$3); sub(":"," ",$3); print $3}' logfile
Помнят, что по умолчанию, awk разделения на пробеле, таким образом считая пробелы любой стороной эти -
, поле даты $3
не $2
.
В первую очередь, для выполнения awk
сценарии необходимо использовать awk
интерпретатор. Можно или сделать это на командной строке непосредственно (awk '{print $2}' file
), или можно создать awk сценарий. То, что является необходимо, должно так или иначе принести awk
в уравнение. Вы не можете использовать оболочку для выполнения awk
команды, [только 118] могут сделать это.
В этом случае, сценарий не действительно необходим, поскольку 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-е поле и передаю его до [1 121] sed
, который просто заменяет первое :
пространством (s#:# #
) и весь /
с пробелами ( весь из-за g
в [1 118]).
, С другой стороны, Вы могли просто переключиться на [1 119] для всего этого:
perl -pe 's/.*?\[(.+?)\s\S+\].*/$1/; s/:/ /; s#/# #g' log.txt
Используя 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