在Bash中卷曲,将STDERR重定向到文件除了进度stderr

时间:2016-01-04 18:12:14

标签: shell curl

我的shell脚本将文件上传到服务器。我喜欢stdout和stderr写入文件和控制台。但我不希望stderr的进度条/百分比转到文件。我只想要卷曲错误写入文件。

最初我有这个

curl ...  2>> "$log"

这为下载到日志文件编写了1行或更多行,但没有任何内容可供控制。

然后我将其改为

curl ... 3>&1 1>&2 2>&3 | tee -a "$log"

这写到了控制台和文件,是的!除了它将每个百分比的整个进度写入文件,使得日志文件非常庞大且阅读繁琐。

如何在控制台中查看进度,但只将输出的最后一部分写入文件?

我想要这个

 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                Dload  Upload   Total   Spent    Left  Speed
  106  1166    0     0  106  1166      0   2514 --:--:-- --:--:-- --:--:--  2 106  1166    0     0  106  1166      0    795  0:00      :01  0:00:01 --:--:--     0 106  1166    0     0  106  1166      0    660  0:00:01  0:00:01 --:--:--     0

这是第二次卷曲重定向

的结果
 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                             Dload  Upload   Total   Spent    Left  Speed



 0  9.8G    0     0    0 16384      0  24764   4d 22h --:--:--   4d 22h 24764
  0  9.8G    0     0    0 3616k      0  4098k  0:41:54 --:--:--  0:41:54 15.9M
  0  9.8G    0     0    0 24.2M      0  12.9M  0:12:59  0:00:01  0:12:58 19.8M
  0  9.8G    0     0    0 50.4M      0  17.5M  0:09:34  0:00:02  0:09:32 22.7M
  0  9.8G    0     0    0 79.8M      0  20.5M  0:08:09  0:00:03  0:08:06 24.7M
  1  9.8G    0     0    1  101M      0  20.7M  0:08:04  0:00:04  0:08:00 24.0M
  1  9.8G    0     0    1  129M      0  21.9M  0:07:37  0:00:05  0:07:32 25.1M
  1  9.8G    0     0    1  150M      0  21.8M  0:07:41  0:00:06  0:07:35 25.1M
  1  9.8G    0     0    1  169M      0  21.5M  0:07:47  0:00:07  0:07:40 23.8M
  1  9.8G    0     0    1  195M      0  21.9M  0:07:38  0:00:08  0:07:30 23.0M
  2  9.8G    0     0    2  219M      0  22.1M  0:07:33  0:00:09  0:07:24 23.5M
  2  9.8G    0     0    2  243M      0  22.4M  0:07:29  0:00:10  0:07:19 22.9M
  2  9.8G    0     0    2  273M      0  22.9M  0:07:17  0:00:11  0:07:06 24.6M
..
.. hundreds of lines...
..
99  9.8G    0     0   99 9982M      0  24.8M  0:06:45  0:06:41  0:00:04 24.5M
 99  9.8G    0     0   99  9.7G      0  24.8M  0:06:44  0:06:42  0:00:02 24.9M
 99  9.8G    0     0   99  9.8G      0  24.8M  0:06:44  0:06:43  0:00:01 26.0M
100  9.8G    0     0  100  9.8G      0  24.8M  0:06:44  0:06:44 --:--:-- 25.8M

编辑: 根据{{​​3}}

,我不明白
2>filename
  # Redirect stderr to file "filename."

但如果我使用它,我就不会在文件中获得每个stderr进度线。如果我尝试任何其他解决方案,则每个stderr进度行都会重定向到文件

2 个答案:

答案 0 :(得分:1)

正如视频是一系列帧一样,控制台中的更新百分比是一系列线条。文件中的内容是真正的输出。区别在于文本文件中的回车符,下面是以下文本,而在控制台中则覆盖当前行。

如果您想在控制台中看到更新百分比,而不是文件,则可以使用以下内容:

curl |& tee >(sed '1b;$!d' > log)

或者:

curl |& tee /dev/tty | sed '1b;$!d' > log

答案 1 :(得分:0)

我们假设您有10个巨大的.txt文件test1.txt ... test10.txt

以下是如何使用单个cURL命令上传它们并记录结果而不记录进度表,诀窍是使用--write-out-w选项,来自{ {3}},这些都是上传到FTP的相关字段:

curl -T "test[1-10:1].txt" -u user:password sftp://example.com:22/home/user/ -# -k -w "%{url_effective}\t%{ftp_entry_path}\t%{http_code}\t%{http_connect}\t%{local_ip}\t%{local_port}\t%{num_connects}\t%{num_redirects}\t%{redirect_url}\t%{remote_ip}\t%{remote_port}\t%{size_download}\t%{size_header}\t%{size_request}\t%{size_upload}\t%{speed_download}\t%{speed_upload}\t%{ssl_verify_result}\t%{time_appconnect}\t%{time_connect}\t%{time_namelookup}\t%{time_pretransfer}\t%{time_redirect}\t%{time_starttransfer}\t%{time_total}\n" >> log.txt

对于您的log.txt文件,您可能需要先预先列出列标题:

echo -e "url_effective\tftp_entry_path\thttp_code\thttp_connect\tlocal_ip\tlocal_port\tnum_connects\tnum_redirects\tredirect_url\tremote_ip\tremote_port\tsize_download\tsize_header\tsize_request\tsize_upload\tspeed_download\tspeed_upload\tssl_verify_result\ttime_appconnect\ttime_connect\ttime_namelookup\ttime_pretransfer\ttime_redirect\ttime_starttransfer\ttime_total" > log.txt -#使进度条有点整洁,如: ######################################################################## 100.0% ######################################################################## 100.0%

... curl -T "test[1-10:1].txt"部分允许您指定要上传的文件范围。