LINUX.ORG.RU

awk || perl ? (парсение логов)


0

0

Есть довольно простая задача нужно пропарсить большой лог апача (порядка 50 метров ) и сгруппировать по уникальным хостам

Можно сделать это так: вылить лог апача в БД (через тот же самый Perl) distinct - и все готово (долго) можно все это хранить в памяти и там с ней работать (тем же самым Перлом) А есть ли средство в Линукс, которое позволяет обращаться с файлами определ формата как с тривиальной БД ? (awk,sed etc ...)

anonymous

Ответ на: комментарий от anonymous

По видимому может:

cat /var/log/httpd/access_log | awk {'print $1'} | awk '!_[$0]++'

эта строка дает список уникальных хостов, далее брать каждый из хоста методом может быть head 1 и какнибудь в цикле пересортировывать основной лог. Имхо, тут главная проблема, выделить уникальные хосты из кучи повторяющихся, это делает выражение awk '!_[$0]++'

короче у меня не получилось... :(

vilfred ☆☆
()
Ответ на: комментарий от vilfred

cut, sort -u не помогут?

cut -d\ -f1 /var/log/httpd/access_log | sort -u

Rock
()

Perl. Быстрее в десятки раз. И ничего в БД заливать не надо. Зря, чтоли в Perl-е придумали ассоциативные массивы (хэш-мапы, короче)?

anonymous
()
Ответ на: комментарий от anonymous

> Perl. Быстрее в десятки раз. И ничего в БД заливать не надо. Зря, чтоли в Perl-е придумали ассоциативные массивы (хэш-мапы, короче)?

Совершенно однозначно! Perl! Быстрее и проще, ИМХО, не получиться.

Kirill
()
Ответ на: комментарий от Kirill

Гм я взял просту задачу нужно из файла размеров 100 метров вытащить 1 колонку пробовал cut gawk perl на первом месте оказался cut ( 4-5 сек) на втором месте оказался gawk ( 6-7 сек) на третем месте оказался perl ( 50-60 сек) ..... как раза в десятки раз быстрее, но не Перл....

anonymous
()
Ответ на: комментарий от anonymous

А вот попробуй не просто колонку вырезать, а к примеру, еще только уникальные значения из нее взять.

cut -d\ -f 2 myfile|sort|uniq - 0m15.436s
awk '{print $2}'|sort|uniq - 0m15.346s
perl -ane 'BEGIN {my %k;} $k{"$F[2]"}=1; END {my @k1=sort keys %k; for (@k1) {print "$_\n"}}' myfile - 0m21.016s

Да, сложнее, но уже не сильно дольше. И чем сложнее задача, тем преимущество Перла очевиднее.

Kirill
()
Ответ на: комментарий от Kirill

[OT] awk || perl ? (парсение логов)

<offtopic><flame>

> perl -ane 'BEGIN {my %k;} $k{"$F[2]"}=1; END {my @k1=sort keys %k; for (@k1) {print "$_\n"}}' myfile

Жуть. :)

Когда программа написана на нормальном, но незнакомом, языке, я более-менее могу понять что и как она делает (без подробностей, ессно). Но вот когда что-то написано на Perl... Даже учить его не хочу. А то вот изучишь, начальник будет приставать: "Тут вот до тебя был один..., написал программку. Надо бы доделать маленькую феньку.", а там Perl. Бр-р-р... А так, очень простая отмазка: "Не знаю я Perl. Учить - 3 месяца" :)

> И чем сложнее задача, тем преимущество Перла очевиднее.

Смотря в чём преимущесто. В скорости работы программы? На C не пробовал писать? Если уметь - быстрее чем на Perl получится. А вот в стоимости жизненного цикла - сильно сомневаюсь.

</flame></offtopic>

Rock
()
Ответ на: [OT] awk || perl ? (парсение логов) от Rock

2 Rock:

Топик треда: [OT] awk || perl ? (парсение логов)

А Perl именно для парсинга текста и предназначен. Practical Extraction and Report Language как-никак.

>Смотря в чём преимущесто. В скорости работы программы? На C не пробовал писать?

Премущество над text manipulation утилитами в первую очередь. Для манипуляций с текстом C не особенно предназначен. Perl удобнее на порядок, хотя, конечно, и медленне C.

Хотя, вобщем это все offtopic и holy wars, так что замнем для ясности :-)

Kirill
()
Ответ на: комментарий от Kirill

> perl -ane 'BEGIN {my %k;} $k{"$F[2]"}=1; END {my @k1=sort keys %k; for (@k1) {print "$_\n"}}' myfile

Действительно ужас. Ты сишник штоли? Аль Жабист?

perl -ane '$k{$F[2]}++; END { map {print "$_\n"} sort keys %k}' myfile

anonymous
()
Ответ на: [OT] awk || perl ? (парсение логов) от Rock

> Смотря в чём преимущесто. В скорости работы программы?

Ну так. Всеж критические участки написаны на Си.

> На C не пробовал писать?

Ты сможешь написать реализацию регэкспов лучше чем Ларри Уолл? Ты настолько самоуверен?

> Если уметь - быстрее чем на Perl получится.

Не смешно. Ты еще скажи, что можно быстро писать на ассемблере, если уметь конечно :) Вот только в природе такие уникумы встречаются крайне редко.

> А вот в стоимости жизненного цикла - сильно сомневаюсь.

anonymous
()
Ответ на: комментарий от anonymous

> Ну так. Всеж критические участки написаны на Си

А зачем тогда высокоуровневую часть писать на неудобочитаемом языке? Чтоб никто не догадался?

> Ты сможешь написать реализацию регэкспов лучше чем Ларри Уолл? Ты настолько самоуверен?

Хм. Я разве предложил писать на _голом_ C? Для работы с регекспами существует куча библиотек. pcre, например.

> Ты еще скажи, что можно быстро писать на ассемблере, если уметь конечно :)

Я не имел в виду быстро писать :) Я имел в виду написать программу, которая будет работать быстрее, чем аналогичная на perl.

anonymous
()
Ответ на: комментарий от anonymous

> А зачем тогда высокоуровневую часть писать на неудобочитаемом языке?

Привычки у всех разные. Код на perl короче.

> Чтоб никто не догадался?

:)

> Хм. Я разве предложил писать на _голом_ C? Для работы с регекспами существует куча библиотек. pcre, например.

Ты сам пробовал ей воспользоваться? Насколько компактным и читаемым получается сишный код (даже по сравнеию с "ужасным" перловым)?

Насчет библиотек. CPAN-а для Си нет.

> Я не имел в виду быстро писать :)

А я имел в виду именно это.

> Я имел в виду написать программу, которая будет работать быстрее, чем аналогичная на perl.

Если будет готовый работающий прототип на perl, это можно будет сделать намного быстрее.

anonymous
()
Ответ на: комментарий от anonymous

> Ты сам пробовал ей воспользоваться? Насколько компактным и читаемым получается сишный код (даже по сравнеию с "ужасным" перловым)?

Честно? Не помню :) Я стольким всяким пользовался, что всё не упомнишь. Кроме того, C предлагался для требовательных к производительности приложений, а не для повышения читабельности. К тому же, на C можно лучшать читабельность не ухудшая производительности.

> Насчет библиотек. CPAN-а для Си нет.

Есть Google. :)

> Если будет готовый работающий прототип на perl, это можно будет сделать намного быстрее.

А если будет готовый работающий прототип на удобочитаемом языке, то это можно будет сделать ещё быстрее. :)

anonymous
()
Ответ на: комментарий от anonymous

> Кроме того, C предлагался для требовательных к производительности приложений, а не для повышения читабельности.

Не уверен даже, что будет выигрыш в производительности.

> К тому же, на C можно лучшать читабельность не ухудшая производительности.

Вряд ли. И читабельность (из-за объема сырцов и обилия в них деталей реализации) неважная, и производительность (из-за неумения проводить оптимизацию через границы функций) невеликая.

> Есть Google. :)

Но CPAN-a то нет. Попробуй скажи гуглю 'install Blah::Blah-Blah'

> А если будет готовый работающий прототип на удобочитаемом языке, то это можно будет сделать ещё быстрее. :)

Perl - удобочитаемый (если пишущий на нем его знает).

anonymous
()
Ответ на: комментарий от anonymous

> И читабельность (из-за объема сырцов и обилия в них деталей реализации) неважная,

Это немножко из другой области. Алгоритм может быть низкоуровневым, но программа - читабельной. Именно из-за низкоуровневости алгоритма может быть сложно понять высокоуровневый алгоритм.

> и производительность (из-за неумения проводить оптимизацию через границы функций) невеликая.

Типа, Perl умеет :)

> Попробуй скажи гуглю 'install Blah::Blah-Blah'

Для того чтоб такое сказать, надо знать эти магические Blah::Blah-Blah. А после этого... Согласен, для C либу ещё компилить придётся. Возможно :)

> Perl - удобочитаемый (если пишущий на нем его знает).

Я много раз видел, как люди умудрялись извратиться с вполне нормальным синтаксисом до практически полной нечитабельности. А уж чего эти кексы сделают с Perl мне даже представить страшно. Тут всё дело не в том, можно или нельзя писать читабельные программы, а в том, располагает ли сам язык к такому написанию. На Perl мне _очень_ редко попадаются программы, в которых вообще хоть что-нибудь просматривается.

На самом деле, мы что-то скатились в Perl vs. C, хотя изначально этого не предполагалось :) Если уж Perl vs. что-то, то я выбираю Python. А C - это... "портабельный макроассемблер" (c) Луговский. Примерно, как раньше писали на C+Asm, сейчас роль Asm выполняет C, а роль C... ну, много всяких языков - специализированных и не очень, в зависимости от задачи.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.