CURL Progress Bar: Как передать и извлечь числа только с помощью grep? - PullRequest
3 голосов
/ 15 июля 2009

Это то, что я имею до сих пор:

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

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 06 августа 2014

С помощью 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 выведет их.

3 голосов
/ 15 июля 2009

Вы не можете получить информацию о прогрессе через grep; это не имеет смысла.

curl записывает индикатор выполнения в stderr, поэтому вам нужно перенаправить на стандартный вывод прежде, чем вы сможете выполнить 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%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 голосов
/ 14 января 2011

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

curl source -o dest -# 2> tmp&

grep -o ".....%" tmp | tail -n1
0 голосов
/ 15 июля 2009

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

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

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

grep -p '[0-9]+'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...