Как получить скорость загрузки из вывода wget? - PullRequest
6 голосов
/ 11 октября 2010

Мне нужно загрузить несколько файлов с wget и измерить скорость загрузки.

например. Я скачиваю с

wget -O /dev/null http://ftp.bit.nl/pub/OpenBSD/4.7/i386/floppy47.fs http://ftp.bit.nl/pub/OpenBSD/4.7/i386/floppyB47.fs

и вывод

--2010-10-11 18:56:00--  http://ftp.bit.nl/pub/OpenBSD/4.7/i386/floppy47.fs
Resolving ftp.bit.nl... 213.136.12.213, 2001:7b8:3:37:20e:cff:fe4d:69ac
Connecting to ftp.bit.nl|213.136.12.213|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1474560 (1.4M) [text/plain]
Saving to: `/dev/null'

100%[==============================================================>] 1,474,560    481K/s   in 3.0s

2010-10-11 18:56:03 (481 KB/s) - `/dev/null' saved [1474560/1474560]

--2010-10-11 18:56:03--  http://ftp.bit.nl/pub/OpenBSD/4.7/i386/floppyB47.fs
Reusing existing connection to ftp.bit.nl:80.
HTTP request sent, awaiting response... 200 OK
Length: 1474560 (1.4M) [text/plain]
Saving to: `/dev/null'

100%[==============================================================>] 1,474,560    499K/s   in 2.9s

2010-10-11 18:56:06 (499 KB/s) - `/dev/null' saved [1474560/1474560]

FINISHED --2010-10-11 18:56:06--
Downloaded: 2 files, 2.8M in 5.9s (490 KB/s)

Мне нужно узнать общую скорость загрузки, то есть строку 490 KB/s. Как мне это сделать?

P.S. Может потребоваться учесть случай, когда мы действительно загрузим только один файл, поэтому окончательный вывод не будет начинаться с FINISHED

Ответы [ 5 ]

4 голосов
/ 11 октября 2010

Обновление, версия в стиле grep с использованием sed:

wget ... 2>&1 | sed -n '$,$s/.*(\(.*\)).*/\1/p'

Старая версия:

Я думал, что проще разделить размер файла на время загрузки после загрузки. ; -)

(/usr/bin/time -p wget ... 2>&1 >/dev/null; ls -l newfile) | \
awk '
   NR==1 {t=$2};
   NR==4 {printf("rate=%f bytes/second\n", $5/t)}
'

В первой строке awk хранится прошедшее реальное время "real xx.xx" в переменной t. Вторая строка awk делит размер файла (столбец 5 из ls -l) на время и выводит его как скорость.

1 голос
/ 07 декабря 2014

Это работает, когда загружается только 1 файл.

Я начал использовать sed для получения скорости от wget, но мне это показалось раздражающим, поэтому я переключился на grep.

Это моя команда:

wget ... 2>&1 | grep -o "[0-9.]\+ [KM]*B/s"

Опция -o означает, что она возвращает только эту часть. Он соответствует 1 или более из 10 цифр, затем пробела. Затем по выбору K или M до B/s

Это вернет 423 KB/s (например).

Чтобы использовать только единицы измерения, используйте grep -o "[KM]*B/s", а для числа - grep -o "[0123456789]\+.

1 голос
/ 11 октября 2010

Это сработало для меня, используя ваш wget -O /dev/null <resource>

Регулярное выражение, которое я использовал, было \([0-9.]\+ [KM]B/s\)

Но обратите внимание, мне пришлось перенаправить stderr на stdout, поэтому команда была:

wget -O /dev/null http://example.com/index.html 2>&1 | grep '\([0-9.]\+ [KM]B/s\)'

Это позволяет вещам типа 923 KB/s и 1.4 MB/s


grep просто находить совпадения.Чтобы получить значения, вы можете использовать sed вместо:

wget -O /dev/null http://example.com/index.html 2>&1 |
    sed -e 's|^.*(\([0-9.]\+ [KM]B/s\)).*$|\1|'
0 голосов
/ 12 октября 2010

вот предложение. Вы можете использовать опцию wget's --limit-rate=amount. Например,

--limit-rate=400k ограничит скорость поиска до 400 КБ / с. Тогда вам легче рассчитать общую скорость. Экономит ваше время и душевные муки, пытаясь отгадать это.

0 голосов
/ 11 октября 2010

Почему вы не можете просто сделать это:

perl -ne "/^Downloaded.*?\((.*?)\)/; print $1"
...