过滤时间(1)输出仅获取时间值

时间:2010-11-29 11:33:43

标签: macos shell awk zsh

如何在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所以我的解决方案是将输出“重定向”到stdout并继续黑客攻击字符串:)

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

3 个答案:

答案 0 :(得分:4)

使用zsh builtin time时,设置变量TIMEFMT以控制输出(请参阅man zshparam)。

要重现没有alpha字符串的默认输出:

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

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

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

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

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

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

答案 1 :(得分:2)

这里的通用答案是,为了处理time的输出,你必须有一个像

这样的结构
(time command 1>/dev/null) 2>&1 | ... 

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

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

答案 2 :(得分:1)

有点破解,但你可以删除非数字字符?

tr -dc '[:digit:]. '

编辑:此外,输出可能会转到stderr,因此将其重定向到stdin 2>& 1