42

使用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

4

5 回答 5

64

time将其输出写入标准错误,因此您需要通过管道传输标准错误而不是标准输出。但同样重要的是要记住这time是 bash 语法的一部分,它会为整个管道计时。因此,您需要将管道包裹在大括号中,或者在子外壳中运行它:

 $ { 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实用程序的更多详细信息。

于 2013-06-23T04:41:54.310 回答
17
(time ls -l)  2>&1 > /dev/null |grep real

这会将 stderr(时间发送输出的地方)重定向到与 stdout 相同的流,然后将 stdout 重定向到 dev/null,因此不会捕获 ls 的输出,然后将现在的时间输出通过管道传输到 grep 的标准输入中。

于 2013-06-23T04:34:35.743 回答
13

如果只想指定time builtin的输出格式,可以修改TIMEFORMAT环境变量的值,而不是用grep.

在你的情况下,

TIMEFORMAT=%R
time ls -l

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

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

是关于解析输出的类似问题time

于 2013-06-23T04:46:04.997 回答
3

注意.. 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
于 2016-06-23T18:26:13.180 回答
-1

我认为,它可以变得更容易一些:

time ls &> /dev/null | grep real
于 2015-04-19T22:25:08.270 回答