【问题标题】:Strip characters from cURL command output从 cURL 命令输出中去除字符
【发布时间】:2023-03-11 17:21:01
【问题描述】:

我希望通过仅获取其进度条输出的前几个字符来获取 cURL 命令的下载进度。通常,我会使用${string:position:length},但在这种情况下似乎不起作用。

这是我正在使用的:

curl -O https://file.download.link/ > output.txt 2>&1

如您所见,我将 cURL 命令的输出重定向到文件 output.txt,但假设我只想存储前三个字符。使用我刚才的建议会返回“错误替换”错误:

echo ${curl -O https://file.download.link/:0:3} > output.txt 2>&1

所以我在这里超出了我的深度。

如果您想要更多上下文,我希望将命令更改为输出到命名管道,以便更改 CocoaDialog 进度条的进度。我基本上给出了 cURL 下载进度条的 GUI 表示。

我会真的感谢您提供的任何帮助或建议,所以提前感谢您。

...如果这是一个“不好”的问题,我深表歉意。我对 bash 和一般的脚本编写相当陌生。

【问题讨论】:

    标签: bash curl command output strip


    【解决方案1】:

    这里有两种方法可以获取 curl 生成的每一行/更新的前三个字符。请注意,在 curl 打印其标题和第一个输出行之后,输出的每个后续行/更新之前都不是换行符,而是回车符\r。在终端上,这使输出具有漂亮的就地更新外观。在我们的例子中,我们必须添加一些特殊处理,如下所示,以正确解释\r

    使用 tr 和 grep

    curl -O https://file.download.link/ 2>&1 |  tr '\r' '\n' | grep -o '^...' >output.txt
    

    使用 awk

    curl -O https://file.download.link/ 2>&1 | awk -v RS='\r' '{print substr($0,1,3)}' >output.txt
    

    样本输出

    $ curl -O http://www.google.com/index.html 2>&1 | awk -v RS='\r' '{print substr($0,1,3)}'
      %
      0
    100
    

    【讨论】:

    • 感谢您提供如此出色的解释,但它似乎没有给我任何输出。我复制了您的代码并替换了链接,但是当从终端调用时没有返回任何内容(与脚本相同,生成了空文件)。看起来它正在等待我的标准输入。当然,文件仍然可以正常下载。有什么想法吗?
    • 好的。您尝试了哪个版本:grep 还是 awk?使用谷歌(所以我们得到相同的东西),尝试:curl -O http://www.google.com/index.html 2>&1 | tr '\r' '\n' 并告诉我你看到了什么。
    • 哦,我明白这里发生了什么。我的问题是我正在尝试使用更大的文件,所以当我开始下载时文本没有写入时,我感到很困惑。我真正需要的是定期将下载进度写入文件,而不是全部写入文件。这样我就可以不断更新我的进度条。编辑:从终端使用时,这些值确实会像我预期的那样定期出现。
    • @Otuku 好的。这是缓冲的问题。 unbufferstdbuf 是试图克服这个问题的标准实用程序。你有安装吗?请查看here,看看是否有任何解决方案适合您的情况。例如,其中一个建议是使用gawk 代替awk
    • @Otuku 更多解决缓冲问题的例子是here
    猜你喜欢
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 2021-09-15
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多