Search code examples
linuxshellcommand-linecurlgrep

CURL Progress Bar: How to pipe and extract numbers only using grep?


This is what I have so far:

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

I wish to use grep and only extract the percentage from that progress bar that CURL outputs.

I think my regex is not correct and I am also not sure if this grep will take effect of the the percentage being continuously updated?

What I am trying to do is basically get CURL only to give me the percentage number as the output and nothing else.

Thank you for any help.


Solution

  • You can't get the progress info like that through grep; it doesn't make sense.

    curl writes the progress bar to stderr, so you have to redirect to stdout before you can grep it:

    $ curl -# -o f1.flv 'http://osr.com/f1.flv' 2>&1 | grep 1 | less results in:

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

    Are you expecting a continual stream of numbers that you are redirecting somewhere else? Or do you expect to grab the numbers at a single point?

    If it's the former, this sort of half-assedly works on a small file:

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

    But it's useless on a large file. The output doesn't print until the download is finished, probably because curl seems to be sending ^H's to the terminal. There might be a better way to sed it, but I wouldn't hold my breath.

    $ 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%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%