Помощь скриптов Awk

Привет, ребята, новички в написании сценариев и посмотрите, почему я получаю следующее сообщение об ошибке:

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]

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

0
задан 20.05.2020, 06:43

3 ответа

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

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

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

0
ответ дан 20.05.2020, 06:43

В первую очередь, для выполнения 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 
0
ответ дан 20.05.2020, 06:44

Используя 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
ответ дан 20.05.2020, 06:44

Теги

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