LINUX.ORG.RU

Комбинацией head и tail. Я думал, что это костыль, но мне тут как-то объяснили, что вполне нормальное решение. Ещё sed, вроде, как-то может.

GotF ★★★★★ ()
┌[~]
└> time tail -n+115000 .mpdscribble/mpdscribble.log | head -n1
[2010/06/08 04:24:54] notice: (saved 7 songs to cache)

real	0m0.013s
user	0m0.012s
sys	0m0.004s
┌[~]
└> time sed -n '115000 p' .mpdscribble/mpdscribble.log 
[2010/06/08 04:24:54] notice: (saved 7 songs to cache)

real	0m0.342s
user	0m0.320s
sys	0m0.016s
GotF ★★★★★ ()
Ответ на: комментарий от GotF

Есть над чем задуматься, согласитесь (=

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

ага, над тем, что sed надо правильно использовать :) (седа не знаю, сделал на awk, sed д.б. не медленнее)

$ time tail -n+115000 server.log.2010-06-08 | head -n1
blah-blah

real 0m0.265s
user 0m0.025s
sys 0m0.048s
$ time awk 'NR==115000{print;exit}' server.log.2010-06-08
blah-blah

real 0m0.145s
user 0m0.101s
sys 0m0.043s

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

У тебя tail/head какие-то медленные...

┌[~]
└> time tail -n+115000 .mpdscribble/mpdscribble.log | head -n1
[2010/06/08 04:24:54] notice: (saved 7 songs to cache)

real	0m0.014s
user	0m0.008s
sys	0m0.008s
┌[~]
└> time awk 'NR==115000{print;exit}' .mpdscribble/mpdscribble.log
[2010/06/08 04:24:54] notice: (saved 7 songs to cache)

real	0m0.044s
user	0m0.032s
sys	0m0.008s

awk сливает. Правда, у меня

┌[~]
└> update-alternatives --display awk 
awk - status is auto.
 link currently points to /usr/bin/gawk
/usr/bin/mawk - priority 5
 slave nawk: /usr/bin/mawk
 slave nawk.1.gz: /usr/share/man/man1/mawk.1.gz
 slave awk.1.gz: /usr/share/man/man1/mawk.1.gz
/usr/bin/gawk - priority 10
 slave nawk: /usr/bin/gawk
 slave nawk.1.gz: /usr/share/man/man1/gawk.1.gz
 slave awk.1.gz: /usr/share/man/man1/gawk.1.gz
Current `best' version is /usr/bin/gawk.
GotF ★★★★★ ()
Ответ на: комментарий от GotF

> time tail -n+115000 .mpdscribble/mpdscribble.log | head -n1

имхо это неправильное измерение. time меряет tail, а не весь пайп.

я бы так мерял:

time { tail -n+115000 .mpdscribble/mpdscribble.log | head -n1; }

dilmah ★★★★★ ()
Ответ на: комментарий от dilmah
┌[~]
└> time { tail -n+115000 .mpdscribble/mpdscribble.log | head -n1; } 
[2010/06/08 04:24:54] notice: (saved 7 songs to cache)

real	0m0.014s
user	0m0.012s
sys	0m0.004s

То же самое (=

GotF ★★★★★ ()
Ответ на: комментарий от dilmah

А разве тогда в head не шел бы вывод time'а? ЕЯПП, time измеряет весь-таки пайп.

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

> А разве тогда в head не шел бы вывод time'а?

нет, большинство диагностических утилит типа time, strace пишут в stderr, а не stdout

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

провел эксперимент: если используется time как builtin баша, то он
умный и просчитывает весь пайп:

$ time cat atom.h | awk '{ while(1) { a=1 } }'
^C

real 0m2.630s
user 0m2.630s
sys 0m0.010s

Если же используется отдельная утилита time, то как и следовало
ожидать из синтаксиса шелла, она не относится ко всему пайпу:

$ /usr/bin/time cat atom.h | awk '{ while(1) { a=1 } }'
0.00user 0.01system 0:00.00elapsed 1000%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+222minor)pagefaults 0swaps
^C

dilmah ★★★★★ ()
Ответ на: комментарий от GotF

Сколько строк в файле, попробуйте ещё до кучи

sed '115000q;d' .mpdscribble/mpdscribble.log

mky ★★★★★ ()
Ответ на: комментарий от mky
┌[~]
└> time sed '115000q;d' .mpdscribble/mpdscribble.log 
[2010/06/08 04:24:54] notice: (saved 7 songs to cache)

real	0m0.332s
user	0m0.332s
sys	0m0.000s

А строк много из-за того, что я verbose logging всё забываю отключить %)

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

Да, результат интерестный. Сложил вместе логи за месяц, получил файл в 7727739 строк. Выбирал строку номер 1150000, получил:

# time tail -n+1150000 BigLOG.txt | head -n1
May 22 04:15:10 ms postfix/smtpd[3878]: disconnect from ... 

real    0m0.491s
user    0m0.360s
sys     0m0.130s


# time sed '1150000q;d' BigLOG.txt 
May 22 04:15:10 ms postfix/smtpd[3878]: disconnect from ...

real    0m0.818s
user    0m0.720s
sys     0m0.100s

# time awk 'NR==1150000{print;exit}'  BigLOG.txt 
May 22 04:15:10 ms postfix/smtpd[3878]: disconnect from...

real    0m1.800s
user    0m1.620s
sys     0m0.140s

То есть tail + head практически в 1,5 раза быстрее, чем sed.

mky ★★★★★ ()

perl -ne 'print ((номерстроки == $.) ? $_ : "")' file

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