命令行输出保存到文件时,如何清理命令行反复输出的进度信息给文件瘦身?

本文属记录性的文章,仅供参考

问题描述

写shell脚本时,如果将输出保存到文件,有些支持在屏幕上动态显示进度的命令(如docker pullcurlwgetaws s3ossutil等)会通过回车符CR,即 \r来更新最后一行已经输出过的内容,用来更新进度百分比、进度条等。
比如阿里云的ossutil工具,在交互式终端使用时,它的进度条会不断更新:

# 过程中
root@localhost:~$ ossutil cp  oss://oss-bucket/software/example-desktop-11.0.0-win64-zip-chs.zip .
Total num: 1, size:  2,315,088,831. Dealed num: 0, OK size: 1,070,261,950, Progress: 51.001%, Speed: 107325.88KB

# 完成后
root@localhost:~$ ossutil cp  oss://oss-bucket/software/example-desktop-11.0.0-win64-zip-chs.zip .
Succeed: Total num: 1, size: 2,315,088,831. OK num: 1(download 1 objects).                                        

average speed 136382000(byte/s)

19.781217(s) elapsed

完成后的总结报告,共有约169个字符。

但若将这些命令的输出(stdout、stderr)重定向到文件时,输出的这些中间过程便也会进入文件,形成超长的一段内容(这里测试时是702字符),如下:

# 将标准输出重定向到文件
root@localhost:~$ ossutil cp  oss://oss-bucket/software/example-desktop-11.0.0-win64-zip-chs.zip . > down.log
root@localhost:~$ ls -l down.log
-rw-r--r-- 1 root root 702 Jun 21 01:19 down.log # 足足有702字符长

root@localhost:~$ less down.log #查看文件内容
^MTotal num: 1, size: 2,088,315,831. Dealed num: 0, OK size: 1,049,378,790, Progress: 50.250%, Speed: 203556.46KB/s^M 
^MTotal num: 1, size: 2,088,315,831. Dealed num: 0, OK size: 1,388,730,140, Progress: 66.500%, Speed: 62521.22KB/s^M
^MTotal num: 1, size: 2,088,315,831. Dealed num: 0, OK size: 1,931,692,300, Progress: 92.500%, Speed: 105637.46KB/s^M  
^MSucceed: Total num: 1, size: 2,088,315,831. OK num: 1(download 1 objects).

average speed 124630000(byte/s)

16.756609(s) elapsed
down.log (END)

这些^M实际上就是\r,将此行光标覆写。如果命令执行的时间比较长,文件中将有非常多的这种进度信息。怎么让这类中间过程不进入最终的日志文件,只保留最终的文本,就像在终端上最后留下的信息一样?

方案一:由程序自动处理

很多命令会自行检测自己的标准输出是否为终端( isatty(3) ),若不是终端(如文件),程序的行为会自行改变,如禁用颜色高亮、自动静默进度输出等。若程序没有检测,或相应行为达不到要求,看下一个方案。

方案二:使用程序的命令行参数

不少命令(grep,curl,wget等),拥有一些控制输出方式的参数。通过使用命令-h--helpman 命令等方式,看看有没有关于quiet(-q),verbose(-v),silent(-s),no-progress相关的参数。

  • grep命令,使用--color=auto/always/never这样的命令强制控制颜色
  • curl命令,使用-s参数禁用stderr进度条输出
  • wget命令,使用-q参数禁用进度输出

但也有可能,你使用的命令并没有这样的参数(比如ossutil我没有找到),则继续往后看

方案三:直接关闭标准输出(简单粗暴)

直接 ossutil ... > /dev/null 问题解决

方案四:小工具col登场

我们可以了解一下col这个自带的命令(重点关注-b参数,文档页链接 col(1), col )

col过滤掉反向的换行(回车符),只保留正向的换行,所以输出的顺序是正确的。它还将任何空白的字符替换为制表符,这在处理 nroff(1) 和 tbl(1)的输出时非常有用。col从标准输入读取并写入标准输出。

-b, --no-backpaces
假设使用的输出设备不具备(光标)后退功能。在这种情况下,如果要在同一位置显示两个或更多的字符,在输出中只显示最后一个被读取的字符。

这正是我们想要的效果。我们用这个命令过滤之后再试一次:

# 将标准输出重定向到文件
root@localhost:~$ ossutil cp  oss://oss-bucket/software/example-desktop-11.0.0-win64-zip-chs.zip . | col -b > down.log
root@localhost:~$ ls -l down.log
-rw-r--r-- 1 root root 169 Jun 21 01:44 down.log # 只有169字符长了

root@localhost:~$ less down.log #查看文件内容,还是有些问题,但短了
Succeed:mTotalsnum: 1,0size:52,088,315,831.uOK num:K1(download61,objects).Progress: 60.750%, Speed: 42627.66KB/ss

average speed 143982000(byte/s)

14.504900(s) elapsed
down.log (END)

发现确实没有了中间过程,但输出的内容有些问题。真实的报告第一行应该是:

Succeed: Total num: 1, size: 2,088,315,831. OK num: 1(download 1 objects).                                        

猜测可能是空格没有得到妥善处理。在很多命令这个col -b是有效的,可能是这个ossutil的输出比较特殊?

方案五:放弃文件瘦身,能看到正确结果就行

直接将原始命令command > down.log,得到肥胖的文件,然后

cat down.log

我们就看到了仿佛在屏幕上执行的结果。因为我们的终端会正确处理所有文件中存储的控制字符。

关键词

stdout 标准输出 回车符 进度 日志文件 重定向 col命令

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容