正则表达式匹配时间与秒

时间:2016-08-21 00:23:51

标签: regex bash

我有如下的日志输入行;

ng with SeqID 339708.08/17/2016 16:27:18.946 - JobID 33720: Location 15531 applied clip data successfully. Updating OCAMT_GM_Sent

Retry count 008/17/2016 16:27:15.227 - JobID 33480: Location 15664 applied clip data successfully. Updating OCAMT_GM_Sent

我正在尝试使用正则表达式捕获时间字符串。到目前为止,我想出了以下内容;

[0-9]{2}+[:]+[0-9]{2}+[:]+[0-9]{2}+[.]+[\d]+$

但是还有另一种方法可以更准确地捕获所述时间字符串并将其放在bash上的变量上。

3 个答案:

答案 0 :(得分:1)

第1步:简化原始正则表达式

您的正则表达式可以简化为

\d{2}:\d{2}:\d{2}\.\d+

这是因为[0-9]相当于\d,而[]对在单个字符周围是多余的。至于秒与小数部分之间的字面点,建议使用\对其进行转义。

第2步:捕获秒部分

如果要匹配秒部分,可以添加一组捕获括号。

\d{2}:\d{2}:(\d{2}(?:\.\d+)?)

作为奖励,这里的匹配更加通用,因为我们不再假设应该存在十进制秒部分(因此内部非捕获组,由?:发出信号标记物)。

注意:我在整个过程中都假设了PCRE。

答案 1 :(得分:0)

.*:([\d.]+)

假设数字和点组合成功的冒号将成为你的序列,那么这将有效。

注意,这假设最后一个冒号后跟数字和句号的序列将是你的秒。

让它更强大:

.*? \d+:\d+:([\d\.]+)

现在,这会对所有内容进行非贪婪的匹配,因为我们希望确保在时间字符串的开头停止。然后在捕获秒数时匹配时间字符串。

如何更进一步,让它更加万无一失: .*? \d+:\d+:(\d+(\.\d+)?)

现在,这符合您的秒数,并且在那里有可选的小数秒,并且不会将某个错误的数字与多个点匹配

答案 2 :(得分:0)

假设行像“... time - JobID ...”,您可以使用

pat=" ([0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}) - JobID "
[[ $line =~ $pat ]] && time=${BASH_REMATCH[1]}