对awk正则表达式匹配数字感到困惑[0-9]

时间:2013-03-14 04:28:16

标签: regex awk

我是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”?

2 个答案:

答案 0 :(得分:0)

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

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

ps -o etime -p 18613 | awk 'NR == 2 { print substr($0, 4); }'

答案 1 :(得分: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","") }'