如何将不断更改的stderr附加到文件或标准输出

时间:2015-03-05 12:23:35

标签: bash shell curl

我可能无法正确地搜索我的搜索,但是如果在执行的每一秒都被覆盖,我找不到任何方法来收集stderr/stdout的所有值。

top之类的命令不会出现问题,因为它会为每秒统计信息向stdout写一个新页面,但在某些情况下会像curl那样进展在stderr中显示并且它每秒被覆盖,我找不到一种方法来收集stderr的所有每秒值,这是协议分析所需要的。

要添加更多详细信息:

$ curl -o /dev/null --trace-ascii trace --trace-time    http://cachefly.cachefly.net/10mb.test
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                             Dload  Upload   Total   Spent    Left  Speed
0 10.0M    0 65057    0     0  43039      0  0:04:03  0:00:01  0:04:02 43027^C

$ curl -o /dev/null --trace-ascii trace --trace-time http://cachefly.cachefly.net/10mb.test
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                             Dload  Upload   Total   Spent    Left  Speed
13 10.0M   13 1376k    0     0   425k      0  0:00:24  0:00:03  0:00:21  425k^C

如您所见,stderr正在stdout上显示,但每秒都被覆盖。即使我将它附加到文件,该文件只包含命令终止之前的最后一个值,而我希望该文件包含所有每秒值的列表。 我已经阅读man curl的每一行,看看是否有可能这样的事情,但也许这不是我应该看的地方。任何帮助/重定向将不胜感激!

感谢您的期待。

1 个答案:

答案 0 :(得分:2)

输出包含$'\r'字符,可将光标移回行首。只需将其替换为文件中的换行符,您就会看到所有行。

sed -i~ 's/\r/\n/g' input

sed需要读取整个“行”以产生输出,所以如果你不想等到最后,切换到Perl:

curl -o /dev/null --trace-ascii trace --trace-time http://cachefly.cachefly.net/10mb.test 2>&1 \
    | perl -pe 'BEGIN{$/="\r"}s/\r/\n/'