当我跑步时
curl https://example.com -o example.html 2>&1 | grep -P "\d.*\d"
我得到这个输出(红色):
100 1270 100 1270 0 0 318 0 0:00:04 0:00:04 0:00:00 318
我想要的只是显示 cURL 进度条的最后一行当它更新时(实际上我只想显示某些列,但显示整行就可以了)
想要的输出(在时间 t = 1 秒时):
user@comp:~/Desktop/$ curl https://example.com -o example.html 2>&1 | grep -P "\d.*\d"
25 1270 25 318 0 0 318 0 0:00:01 0:00:01 0:00:03 318
想要的输出(在时间 t = 2 秒):
user@comp:~/Desktop/$ curl https://example.com -o example.html 2>&1 | grep -P "\d.*\d"
50 1270 50 636 0 0 318 0 0:00:02 0:00:02 0:00:02 318
想要的输出(在时间 t = 3 秒):
user@comp:~/Desktop/$ curl https://example.com -o example.html 2>&1 | grep -P "\d.*\d"
75 1270 75 954 0 0 318 0 0:00:03 0:00:03 0:00:01 318
想要的输出(在时间 t = 4 秒):
user@comp:~/Desktop/$ curl https://example.com -o example.html 2>&1 | grep -P "\d.*\d"
100 1270 100 1270 0 0 317 0 0:00:04 0:00:04 0:00:00 0
我尝试过将 watch 与 cURL 和 grep 一起使用,但它仍然不起作用(无输出)
watch --no-title --interval 1 "curl http://example.com -o test2.html" | grep -P '\d.*\d'
答案1
由于管道缓冲,您无法直接| grep
输出curl进度。上一个问题中提供了有关此问题的一些重要见解:关闭管道中的缓冲
至于解决方案,使用stdbuf
和tr
:
curl https://example.com -o example.html 2>&1 | stdbuf -oL tr -s '\r' '\n' | while read i; do echo -en "\r$i "; done
和:
stdbuf -oL
:stdouttr
将被行缓冲以便循环正确while
处理tr -s '\r' '\n'
curl
:用输出中的换行符替换回车符while read i; do echo -en "\r$i "; done
:bash
进度线的简单解决方案