Grep time命令输出

jet*_*mba 35 linux

使用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
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试grep实际值线时,实际结果是:

$ time ls -l | grep real
real    0m0.040s
user    0m0.000s
sys     0m0.031s
Run Code Online (Sandbox Code Playgroud)

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

ric*_*ici 58

time将其输出写入stderr,因此您需要管道stderr而不是stdout.但同样重要的是要记住,这time是bash语法的一部分,它是整个管道的时间.因此,您需要将管道包装在大括号中,或者在子shell中运行它:

 $ { time ls -l >/dev/null; } 2>&1 | grep real
 real   0m0.005s
Run Code Online (Sandbox Code Playgroud)

使用bash V4.0(可能是在Linux发行版普遍,但仍然在Mac OS X不达标),你可以使用|&管道都stdoutstderr:

{ time ls -l >/dev/null; } |& grep real
Run Code Online (Sandbox Code Playgroud)

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

/usr/bin/time -f%e ls -l >/dev/null 
Run Code Online (Sandbox Code Playgroud)

man time有关time实用程序的更多详细信息.

  • `|&` 对我来说很有效。 (2认同)

Cly*_*yde 14

(time ls -l)  2>&1 > /dev/null |grep real
Run Code Online (Sandbox Code Playgroud)

这会将stderr(时间发送其输出的地方)重定向到与stdout相同的流,然后将stdout重定向到dev/null,这样就不会捕获ls的输出,然后将现在输出的时间输入到grep的stdin中.

  • 要完成,你应该添加`| awk'{print $ 2}'`到最后,因为OP只需要时间部分. (6认同)

dou*_*own 10

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

在你的情况下,

TIMEFORMAT=%R
time ls -l
Run Code Online (Sandbox Code Playgroud)

会给你"真正的"时间.

以下是 Bash手册中相关信息的链接(在"TIMEFORMAT"下).

关于解析输出的问题,是一个类似的问题time.

  • 这样输出效果更好。serafina@box:~$ TIMEFORMAT=%R && 时间 ls > /dev/null 0.001 (2认同)