我对 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”?
正如西蒙在他对您的问题的评论中所说,awk
当以这种方式使用时,只会打印完整的匹配行。
对于您的特定情况,我认为只需打印第二行就足够了,减去前三个字符(即从第四个字符开始),您可以这样做:
ps -o etime -p 18613 | awk 'NR == 2 { print substr($0, 4); }'
要使用 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","") }'