grep时间命令输出

使用time ls ,我有以下输出:

 $ time ls -l total 2 -rwx------+ 1 FRIENDS None 97 Jun 23 08:59 location.txt -rw-r--r--+ 1 FRIENDS None 10 Jun 23 09:06 welcome real 0m0.040s user 0m0.000s sys 0m0.031s 

现在,当我尝试grep只有真正的价值线,实际结果是:

 $ time ls -l | grep real real 0m0.040s user 0m0.000s sys 0m0.031s 

我的问题是,如何才能得到真正的价值作为输出? 在这种情况下, 0m0.040s

time将其输出写入标准错误,所以你需要管道标准错误而不是标准输出。 但是也要记住, time是bash语法的一部分,并且它是整个管道的一部分。 因此,您需要将管道包装在花括号中,或者在子shell中运行它:

  $ { time ls -l >/dev/null; } 2>&1 | grep real real 0m0.005s 

使用Bash v4.0(可能在Linux发行版上是通用的,但在Mac OS X上仍然不是标准版),您可以使用|&来管道stdoutstderr

 { time ls -l >/dev/null; } |& grep real 

或者,您可以使用time实用程序,它允许控制输出格式。 在我的系统上,该实用程序位于/usr/bin/time

 /usr/bin/time -f%e ls -l >/dev/null 

man time更多关于time效用的细节。

 (time ls -l) 2>&1 > /dev/null |grep real 

这将stderr(这是时间发送输出的地方)重定向到与stdout相同的流,然后将stdout重定向到dev / null,以便不捕获ls的输出,然后将现在输出的时间输出到grep的stdin。

如果您只想指定内置 time的输出格式,则可以修改TIMEFORMAT环境变量的值,而不是使用grep进行过滤。

在你的情况下,

 TIMEFORMAT=%R time ls -l 

只会给你“真正的”时间。

以下是 Bash手册中相关信息的链接 (在“TIMEFORMAT”下)。

这是关于解析time输出的一个类似的问题。

我想,这可以变得更容易:

 time ls &> /dev/null | grep real 

看看.. bash有一个内置的“时间”命令。 以下是一些不同之处

 # GNU time command (can also use $TIMEFORMAT variable instead of -f) bash> /usr/bin/time -f%e ls >/dev/null 0.00 # BASH built-in time command (can also use $TIME variable instead of -f) bash> time -f%e ls >/dev/null -f%e: command not found real 0m0.005s user 0m0.004s sys 0m0.000s