2

我想[12/Jun/2013:06:31:31 -0700]在日志文件中匹配以下格式的时间戳。

我应该使用什么正则表达式?谢谢

4

2 回答 2

1

尝试

grep -E '\[[0-9]{2}/[A-Z][a-z]{2}/[0-9]{4}:[0-9]{2}:[0-9]{2}:[0-9]{2}.*\]' <<<"[12/Jun/2013:06:31:31 -0700]"

但这只会匹配所描述格式的字符串。

您可能需要检查该日期是否正确。因为字符串

"[94/Non/2084:54:71:99 +9999]"

也将与此正则表达式匹配。

当然,您可以制作带有日期验证的正则表达式,但正则表达式会长 3 倍。

考虑使用 python 日期和时间库来检查有效格式。

你也可以使用unixdate程序

date -d "now" "+[%d/%b/%Y:%H:%M:%S %z]"

现在将打印您想要的日期格式。

显然date -d需要正确的特定输入,因此您需要调整该输入,然后调用 date

proper=`date -d "12/01/2013 06:31:31" "+[%d/%b/%Y:%H:%M:%S %z]"`

然后你可以比较它(警告:时区输出将是你的 tz)

[[ "[12/Jun/2013:06:31:31 -0700]" == "$proper" ]] && echo ok

由于调整和分叉日期,这不是一个好方法。因此,如果需要检查,请使用 python :)

python中的检查函数看起来像这个小例子

def isTimeFormat(input,timeformat):

try:
    # Parse input to timeformat
    time.strptime(input, timeformat)
    # It was OK, no exception raised
    return True
# if there is an extra data or string cannot be parsed according to format, exception is raised
except ValueError:
    return False

最后,当您使用正则表达式检查输入时,您可以在 python 中轻松进行比较

withTZ="[12/Jun/2013:06:31:31 -0700]" 
withoutTZ=withTZ[0:21]+withTZ[27:] 
if isTimeFormat(withoutTZ,"[%d/%b/%Y:%H:%M:%S]"):
  print("OK")
于 2013-06-14T10:32:29.510 回答
0

假设这只是从日志文件中获取时间戳,您可能不需要任何验证,所以只需使用这个正则表达式:

\[\d{2}\/[a-zA-Z]{3}\/\d{4}:\d{2}:\d{2}:\d{2} [+-]\d{4}\]
于 2013-06-14T11:04:10.673 回答