На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
Grih65kop
Сообщения: 145
Сообщение
Grih65kop » 13.07.2012 21:26
Есть строка
Код: Выделить всё
11.11.11.11 - - [13/Jul/2012:10:44:31 +0400] /1111/1.php
Нужно получить из нее:
13/Jul/2012 11.11.11.11 /1111/1.php
С
проблем нету.
Делаю так:
Но вот как выбрать 13/Jul/2012 при помощи awk в данной команде не могу представить. Подскажите, пожалуйста, решение.
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Сообщение
sash-kan » 13.07.2012 23:32
Grih65kop писал(а): ↑ 13.07.2012 21:26
как выбрать 13/Jul/2012 при помощи awk в данной команде не могу представить
примерно как на sed-е (только на awk):
$ echo '11.11.11.11 - - [13/Jul/2012:10:44:31 +0400] /1111/1.php' | sed -r 's/^([^ ]*) .*\[([^:]*).*\]/\2 \1/'
13/Jul/2012 11.11.11.11 /1111/1.php
Grih65kop
Сообщения: 145
Сообщение
Grih65kop » 13.07.2012 23:48
Спасибо за ответ, но у меня проблема именно в том как реализовать, впихнуть регулярное выражение в мой awk сценарий.
Grih65kop
Сообщения: 145
Сообщение
Grih65kop » 14.07.2012 02:15
Пожалуй мне с самого начала нужно было выложить полную исходную строку:
Код: Выделить всё
разные строки
11.11.11.11 - - [13/Jul/2012:10:44:31 +0400] "GET /1111/1.php HTTP/1.1" 401 21 "-" "Opera/9.80 (X11; Linux i686; U; en) Presto/2.10.289 Version/12.00" "-"
разные строки
Из-за отсутствие более удачного варианта сделал такой костыл:
grep '\" 401\ ' 1 | sed 's/\:/\ /;s/\[/\ /' | awk -F\ '{print $4,$1,$8}'
Выбираю сперва строку с кодом 401 и заменяю в ней символы : и [ на пробел, а затем уже собираю необходимую мне строку из первого поста.
sed и awk вместе, но точно знаю что можно решить все одним инструментом.
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Сообщение
sash-kan » 16.07.2012 13:28
Grih65kop писал(а): ↑ 14.07.2012 02:15
но точно знаю что можно решить все одним инструментом
да, конечно:
Код: Выделить всё
$ cat file
разные строки
11.11.11.11 - - [13/Jul/2012:10:44:31 +0400] "GET /1111/1.php HTTP/1.1" 401 21 "-" "Opera/9.80 (X11; Linux i686; U; en) Presto/2.10.289 Version/12.00" "-"
разные строки
$ cat file | sed -rn '/" 401 /{s/^([^ ]*) .*\[([^:]*).*\] "GET ([^ ]*) .*/\2 \1 \3/;p}'
13/Jul/2012 11.11.11.11 /1111/1.php
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 17.07.2012 11:58
sash-kan , откуда такая нелюбовь к awk? Он же тоже всё умеет (:
Код: Выделить всё
echo '11.11.11.11 - - [13/Jul/2012:10:44:31 +0400] "GET /1111/1.php HTTP/1.1" 401 21 "-" "Opera/9.80 (X11; Linux i686; U; en) Presto/2.10.289 Version/12.00" "-"' | \
awk '/^[0-9]/{sub(/:.*/, "", $4);$4=substr($4,2);print $4,$1,$7}'
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Сообщение
sash-kan » 17.07.2012 18:10
SLEDopit писал(а): ↑ 17.07.2012 11:58
откуда такая нелюбовь к awk?
чтоб не любить, надо для начала хоть man прочитать, а я его не читал…
SLEDopit писал(а): ↑ 17.07.2012 11:58
Он же тоже всё умеет
ни минуты не сомневался·
infra_hdc
Сообщения: 376
ОС: GNU/Linux
Сообщение
infra_hdc » 08.09.2012 02:54
Сделайте так:
Код: Выделить всё
awk '{ n4=$4; sub(/\[/, "", n4); sub(/:[0-9]+:[0-9]+:[0-9]+/, "", n4); print n4 " " $1 " " $6 }'