CURL Progress Bar: как передавать и извлекать числа только с помощью grep?

Это то, что у меня есть до сих пор:

[my1@graf home]$ curl -# -o f1.flv 'http://osr.com/f1.flv' |  grep -o '*[0-9]*'
####################################################################### 100.0%

Я хочу использовать grep и извлекать только процент из этого индикатора выполнения, который выводит CURL.

Я думаю, что мое регулярное выражение неверно, и я также не уверен, повлияет ли этот grep на постоянно обновляемый процент?

То, что я пытаюсь сделать, это в основном получить CURL только для того, чтобы дать мне процентное число в качестве вывода и ничего больше.

Спасибо за любую помощь.


person Abs    schedule 15.07.2009    source источник


Ответы (4)


Вы не можете получить такую ​​​​информацию о ходе выполнения через grep; это не имеет смысла.

curl записывает индикатор выполнения в stderr, поэтому вам нужно перенаправить на stdout, прежде чем вы сможете выполнить grep:

$ curl -# -o f1.flv 'http://osr.com/f1.flv' 2>&1 | grep 1 | less приводит к:

^M                                                                           0.0
%^M######################################################################## 100.
0%^M######################################################################## 100
.0%^M######################################################################## 10
0.0%

Вы ожидаете непрерывный поток номеров, которые вы перенаправляете куда-то еще? Или вы рассчитываете получить цифры в одной точке?

Если это первое, то этот вид наполовину работает с небольшим файлом:

$ curl -# -o f1.flv 'http://osr.com/f1.flv' 2>&1 | sed  's/#//g' -
 100.0%                                                                    0.0%

Но это бесполезно для большого файла. Вывод не распечатывается до тех пор, пока загрузка не будет завершена, вероятно, потому, что curl, похоже, отправляет ^H на терминал. Возможно, есть лучший способ sed, но я бы не стал задерживать дыхание.

$ curl -# -o l.tbz 'ftp://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/2009/06/2009-06-02-05-mozilla-1.9.1/firefox-3.5pre.en-US.linux-x86_64.tar.bz2' 2>&1 | sed 's/#//g' -
 100.0%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
person Mark Rushakoff    schedule 15.07.2009
comment
А, понятно, перенаправьте вывод, чтобы я мог его увидеть. Я надеялся просто извлечь числа, как они выглядят, как вы сказали (бывший). Я пробовал вышеописанное, но я получаю вывод только тогда, когда он достигает 100% - может быть, мне нужен файл большего размера, чтобы увидеть изменение прогресса? - person Abs; 15.07.2009
comment
Вывод Curl предназначен для чтения людьми, а не компьютерами — вот почему формат отстой, когда его воспринимает grep. Возможно, вам повезет больше, используя wget --progress=dot и подсчитывая точки, но тогда это тоже не процент. Или, может быть, вы сможете просто подсчитать # в выводе curl. По крайней мере, вы получите точность до 5-10%, или столько, сколько # поместится в терминале, верно? - person Mark Rushakoff; 15.07.2009
comment
Вы правы, наверное, лучше повезет, подсчитывая хэши. Я не могу использовать wget, так как он по какой-то причине заблокирован моим хостом. В предыдущем вопросе, который я задавал, был консенсус, что CURL — лучший выбор, если вы не можете использовать wget. Следует добавить, какой из других вариантов также имеет простой способ анализа прогресса! - person Abs; 15.07.2009

С curl 7.36.0 (также должно работать для других версий) вы можете извлечь процент следующим образом:

curl ... 2>&1 -# | stdbuf -oL tr '\r' '\n' | grep -o '[0-9]*\.[0-9]'

Здесь ... означает параметры/имена файлов. Это выводит последовательность процентных чисел.

Curl использует возврат каретки \r в своем выводе, поэтому вам нужно tr, чтобы сначала преобразовать их в \n, потому что grep ориентирован на строку. Вам также необходимо изменить настройки выходного буфера с помощью stdbuf, чтобы получать процентные числа сразу после их вывода curl.

person user3913237    schedule 06.08.2014
comment
В моем случае мне также понадобился stdbuf -oL перед grep. Аккуратный ответ, спасибо! - person user1112789; 11.02.2017

Попробуй это:

curl source -o dest -# 2> tmp&

grep -o ".....%" tmp | tail -n1
person Philipp R.    schedule 14.01.2011

Вам нужно использовать .* not * в вашем регулярном выражении.

grep -o '.*[0-9].*'

Это поймает весь текст, поэтому, возможно, попробуйте:

grep -p '[0-9]+'
person samoz    schedule 15.07.2009
comment
Нужно ли мне дополнительно передавать это в эхо, чтобы увидеть результаты grep? - person Abs; 15.07.2009