Разобрать журнал и вывести 2 строки в 1 команде - PullRequest
2 голосов
/ 29 ноября 2011
178.139.20.52 - - [26/Nov/2011:08:21:13 +0000] "POST /test/LinkTest.cgi?e=PATTERN&t3=0:010015&t4=1322295671:587875&l=178.139.20.174&n=149 HTTP/1.1" 200 17 "-" "BOT/1.26"

Выше приведен тип записи журнала, которую я хочу проанализировать.

Мне нравится вывод моей команды:

178.139.20.52 PATTERN

Есть идеи о том, как этого добиться?

Спасибо.

Спасибо за ваши ответы, я собираюсь сделать это:

cat access_log | grep "LinkTest.cgi" | grep "26\/Nov\/2011" | awk -v FS="[ =&]" '{ print $1,$8 }' | sort -u

Ответы [ 5 ]

2 голосов
/ 29 ноября 2011

Вопрос, кажется, недостаточно конкретизирован, поскольку мы не знаем, что может быть в PATTERN Вот отправная точка:

sed -e 's/ .*LinkTest.cgi?e=/ /' -e 's/&.*//'
2 голосов
/ 29 ноября 2011

Я думаю, что grep не подходит для этого, он только фильтрует линии по шаблону. Вы можете использовать переключатель -o только для печати текста, соответствующего этому шаблону, но я не знаю, как вы можете извлечь / напечатать несколько подстрок в grep.

Как насчет этого perl one liner?

perl -ne 'm/^\s*(\d+\.\d+\.\d+\.\d+).+?\?e=([^&]+)/ and print "$1 $2\n"'

2 голосов
/ 29 ноября 2011

Как насчет использования awk

Примечание. Это будет работать, если ваш pattern не содержит =, space или &.

awk -v FS="[ =&]" '{ print $1,$8 }' file

[jaypal:~/Temp] cat file
178.139.20.52 - - [26/Nov/2011:08:21:13 +0000] "POST /test/LinkTest.cgi?e=PATTERN&t3=0:010015&t4=1322295671:587875&l=178.139.20.174&n=149 HTTP/1.1" 200 17 "-" "BOT/1.26"


[jaypal:~/Temp] awk -v FS="[ =&]" '{ print $1,$8 }' file
178.139.20.52 PATTERN
2 голосов
/ 29 ноября 2011

А как насчет этого подхода с использованием GNU sed?

sed -r 's/^(\S+).*e=([^&]+)&.*/\1 \2/'
1 голос
/ 29 ноября 2011

Использование awk:

Содержимое команды 'infile'

178.139.20.52 - - [26/Nov/2011:08:21:13 +0000] "POST /test/LinkTest.cgi?e=PATTERN&t3=0:010015&t4=1322295671:587875&l=178.139.20.174&n=149 HTTP/1.1" 200 17 "-" "BOT/1.26"

Команда Awk на моем компьютере с Linux:

awk 'BEGIN { FS = "=" } { ip = substr( $1, 0, index( $1, " " ) - 1 ); pattern = substr( $2, 0, index( $2, "&" ) - 1 ); printf "%s %s\n", ip, pattern }' infile

Результат:

178.139.20.52 PATTERN
...