我有如下的日志输入行;
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上的变量上。
答案 0 :(得分:1)
您的正则表达式可以简化为
\d{2}:\d{2}:\d{2}\.\d+
这是因为[0-9]
相当于\d
,而[]
对在单个字符周围是多余的。至于秒与小数部分之间的字面点,建议使用\
对其进行转义。
如果要匹配秒部分,可以添加一组捕获括号。
\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]}