grep cURL 输出

grep cURL 输出

当我跑步时

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进度。上一个问题中提供了有关此问题的一些重要见解:关闭管道中的缓冲

至于解决方案,使用stdbuftr

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 "; donebash进度线的简单解决方案

相关内容