【问题标题】:Filter time(1) output to get time values only过滤 time(1) 输出以仅获取时间值
【发布时间】:2010-11-29 11:33:42
【问题描述】:

如何在 OS X 下过滤某些时间命令输出值? 我试过了

➜  ~  (time ls -la)| grep system|awk "{print $4, $6, $8, $10}"
ls -G -la  0.01s user 0.01s system 16% cpu 0.102 total

但是我只想取数字,在本例中为“0.01 0.01 16 0.102” 谢谢

编辑:Paul 指出,输出可能是 go to stderr,所以我的解决方案是将输出“重定向”到标准输出并继续破解字符串 :)

(time ls -la) 2>&1 | grep system | tr -dc '[:digit:]. '

【问题讨论】:

    标签: macos shell awk zsh


    【解决方案1】:

    使用zsh内置time时,设置变量TIMEFMT控制输出(见man zshparam)。

    要重现不带字母字符串的默认输出:

    TIMEFMT='%*E %*U %*S %P'
    

    例如,星号会阻止 s 的输出“秒”。

    当然,如果您真正感兴趣的话,您可以将其限制在一个特定领域。

    重定向时间的输出以将其捕获在变量中或进一步处理:

    duration=$({ time ls -la >/dev/null; } 2>&1)
    

    我将命令的输出重定向到/dev/null,但如果您想捕获它,只需删除该重定向即可。

    【讨论】:

    【解决方案2】:

    这里的通用答案是,为了处理time 的输出,您必须有一个类似的构造

    (time command 1>/dev/null) 2>&1 | ... 
    

    在子shell中对命令进行计时并隐藏其输出,然后捕获时间输出(位于stderr,也称为描述符2)并将其重定向到stdout,然后将stdout定向到管道。之后可以进行进一步处理。

    正如 Dennis Williamson 所说,zsh 的 TIMEFMT 可用于自定义输出。这很好,因为这意味着您在使用 zsh 时可能不必构建管道来重新格式化 time 的输出,但您仍然需要执行 stderr 重定向来捕获输出。

    【讨论】:

      【解决方案3】:

      有点小技巧,但您可以删除非数字字符吗?

      tr -dc '[:digit:]. '
      

      编辑:此外,输出可能会转到 stderr,因此使用 2>&1

      将其重定向到 stdin

      【讨论】:

      • 如果你的意思是(时间 ls -la)| grep 系统|tr -dc '[:数字:]。 ' 我仍然得到相同的结果。时间输出似乎有些神秘,不受管道的影响......
      • 谢谢,保罗,您为我指明了正确的方向。尽管我无法将您的答案标记为已接受,因为它不完整。如果你愿意,你可以编辑它,我会接受的。非常感谢;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 2013-06-02
      • 2020-06-11
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多