我想[12/Jun/2013:06:31:31 -0700]
在日志文件中匹配以下格式的时间戳。
我应该使用什么正则表达式?谢谢
尝试
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")
假设这只是从日志文件中获取时间戳,您可能不需要任何验证,所以只需使用这个正则表达式:
\[\d{2}\/[a-zA-Z]{3}\/\d{4}:\d{2}:\d{2}:\d{2} [+-]\d{4}\]