0

我对 awk 编程很陌生,我尝试通过以下方式提取进程运行时间

$ ps -o etime -p 18613 | awk /[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/
 1-00:05:52

我知道如果超过一天,它将采用 dd-hh:mm:ss 格式,但我只是觉得混淆了正则表达式 /[0-9][0-9]:[0-9][0-9] :[0-9][0-9]/ 也会提取“dd-”,为什么不只在我的结果中显示“00:05:52”?

4

2 回答 2

0

正如西蒙在他对您的问题的评论中所说,awk当以这种方式使用时,只会打印完整的匹配行。

对于您的特定情况,我认为只需打印第二行就足够了,减去前三个字符(即从第四个字符开始),您可以这样做:

ps -o etime -p 18613 | awk 'NR == 2 { print substr($0, 4); }'
于 2013-03-14T05:36:37.563 回答
0

要使用 RE 执行您尝试执行的操作:

ps -o etime -p 18613 |
awk 'match($0,/[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/) { print substr($0,RTSTART,RLENGTH) }'

或者在 GNU awk 中,如果每一行都与您的 RE 匹配:

ps -o etime -p 18613 |
awk '{print gensub(/.*([0-9][0-9]:[0-9][0-9]:[0-9][0-9]).*/,"\\1","") }'
于 2013-03-14T20:47:42.303 回答