在Bash脚本中定义字符串/时间戳匹配正则表达式

时间:2019-03-21 15:35:20

标签: regex bash shell scripting

我必须从bash脚本中读取文件,并始终在执行任何操作之前确认每行上的时间戳是否有效。我的时间戳看起来像这样:

Mar 15 14:20:48

我想检查我阅读的所有时间戳是否都具有正确的格式。我尝试通过以下方式进行操作:

(date -d ...)

但是,即使日期看起来像这样,这种趋向也会通过:Mar 15 14:2

有人告诉我要使用正则表达式来定义日期,所以我一直在使用它

if [["${LASTTS}" =~ ^[a-zA-Z]+ [0-3][0-9]+ [0-2][0-9]:[0-5][0-9]:[0-5][0-9]$ ]]; then

但是在说line 38: [[Mar 15 14:20:48: command not found

时总是出错

2 个答案:

答案 0 :(得分:2)

我相信要求date转换为期望的格式并检查输入日期格式和输出日期格式是否相同可能会更容易。如果它们相同,则输入日期字符串是有效字符串:

如果使用以下命令,它将把字符串转换为有效格式:

date -d "input-date" "+%b %d %T"
  • 在不可能输入的日期中将返回一个空字符串:
  • 无效的输入日期将返回不同的字符串

示例”

input-date (d1) | output-date (d2)| d1 == d2 | input valid
----------------+-----------------+----------+-------------
Mar 15 14:02:15 | Mar 15 14:02:15 | yes      | yes
Mar 15 14:2     | Mar 15 14:02:00 | no       | no
Mar 32 14:02:15 |                 | no       | no
Mak 15 14:02:15 |                 | no       | no
Mar 15 24:02:15 |                 | no       | no

因此您的测试应如下所示:

d1="Mar 15 14:20:48"
d2=$(date -d "$d1" "+%b %d %T" 2> /dev/null)
if [[ "$d1" == "$d2" ]]; then
   echo "the dates are the same"
fi

此方法比使用正则表达式安全一些,因为许多字符串可能会通过正则表达式,但不是有效日期。一个简单的示例就是“ XYZ 39 29:59:12”

如果有OP的问题,它将显示为:

if [[ "${LASTTS}" == $(date -d "${LASTTS}" "+%b %d %T" 2> /dev/null) ]]; then

答案 1 :(得分:2)

假设您的格式始终与“ 3月15日14:20:48”相同(如果正确),则它应始终与+'%b %d %T'相匹配。如果是这样,您不仅可以使用date来验证格式,而且可以验证内容。

$: ts='Mar 15 14:20:48' # valid date/time in correct format
$: [[ "$ts" == "$( date +'%b %d %T' -d "$ts" )" ]] && echo ok || echo mismatch
ok
$: ts='Mar 15 14:2' # valid date/time in wrong format
$: [[ "$ts" == "$( date +'%b %d %T' -d "$ts" )" ]] && echo ok || echo mismatch
mismatch
$: ts='Feb 31 14:20:48' # invalid date/time in correct format
$: [[ "$ts" == "$( date +'%b %d %T' -d "$ts" )" ]] && echo ok || echo mismatch
date: invalid date ‘Feb 31 14:20:48’
mismatch