检查给定的strftime格式是否与日期匹配

时间:2012-04-10 08:39:45

标签: bash date awk gawk strftime

我有strftime格式的时间,比方说(%Y-%m-%d %H:%M:%S)和一个应包含此类数据的文件,例如(2012-02-11 17:15:00)。我需要检查给定的模式是否与数据匹配。 怎么解决这个问题? awk,约会?

修改 更多信息:用户输入strftime格式,让我们说输入。然后他输入一个应包含这些日期的文件。我需要确保这些数据是有效的(他没有犯错误)。所以我需要检查输入文件中的行,看看是否有与给定模式匹配的数据。例如:

  • 用户输入strftime格式:(%Y-%m-%d %H:%M:%S)

    输入文件:(2012-02-11 17:15:00) long sentence

    VALID

  • 用户输入strftime格式:Date[%Y.%m.%d %H:%M:%S]

    输入文件:Date-2012.02.11 17:15:00- long sentence

    INVALID

3 个答案:

答案 0 :(得分:1)

如果您允许使用外部帮助程序二进制文件,我已将dateutils写入批处理日期和时间数据。

dconv -q -i '(%Y-%m-%d %H:%M:%S)' <<EOF
not a match: 2012-04-10 12:00:00
a match: (2012-04-10 13:00:00)
EOF

将给出

2012-04-10T13:00:00

-i是输入格式,-q会抑制警告。 dconv尝试将输入行转换为输出行(在这种情况下,它将匹配的行转换为ISO标准格式。

因此,如果输入行的数量等于输出行的数量,则文件完全匹配。

答案 1 :(得分:0)

如果您想查看当前日期时间:

echo "(2012-02-11 17:15:00)" | grep "$(date "+%Y-%m-%d %H:%M:%S")"

如果其他一些你需要GNU日期(-d选项)。这对我有用:

echo "(2012-02-11 17:15:00)" | 
grep "$(date -d "2012-02-11 17:15:00"  "+%Y-%m-%d %H:%M:%S")"

答案 2 :(得分:0)

我会对此采用强制方法:用相应的正则表达式替换任何%X说明符,然后可以过滤掉与生成的正则表达式不匹配的行:

user_format="%Y-%m-%d"
awk -v fmt_string="$user_format" '
  BEGIN {
    gsub(/[][(){}?|*+.]/ "\\&", fmt_string)  # protect any regex-special chars
    gsub(/%Y/, "([0-9]{4})", fmt_string)
    gsub(/%m/, "(0[1-9]|1[012])", fmt_string)
    gsub(/%d/, "(0[1-9]|[12][0-9]|3[01])", fmt_string)
    # and so on
  }
  $0 !~ "^" fmt_string {print "line " NR " does not match: " $0}
' filename