【问题标题】:Check if given strftime format matches a date检查给定的 strftime 格式是否与日期匹配
【发布时间】:2012-04-10 08:39:45
【问题描述】:

我有 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

    有效

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

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

    无效

【问题讨论】:

  • 我不明白,你想要这个吗-echo "(2012-02-11 17:15:00)" | gawk '{if (NR==1) print strftime("(%Y-%m-%d %H:%M:%S)"), $0}'
  • 我已经删除了解决它的尝试,因为我意识到这是一派胡言。我只需要检查它是否匹配。谢谢
  • awk - checking timecode的可能重复
  • 确实如此。使用 python 有一个很好的解决方案,但就是这样

标签: bash date awk gawk strftime


【解决方案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 标准格式。

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

【讨论】:

  • 很遗憾我可能不会,因为这是家庭作业,我应该只使用“标准”unix 程序。这正是我想要做的。这不能用awk完成吗?谢谢回答。
  • 问题是awk没有strptime()函数,不幸的是perl也没有(没有考虑CPAN扩展)
  • 嗯,做了很多研究,我就是找不到任何东西。所以你真的认为没有 C 就无法解决这个问题?
  • 不,我并不是说它不能完成,我的意思是如果 awk/perl/foo 有一个 strptime() 会容易得多,那么你就去 strptime("(%Y-%m-%d %H:%M:%S)", $input) 和如果成功且没有错误,则说明日期已正确解析。
  • @hroptatyr:Perl 的Time::Piece 是提供strptime() 的核心模块。 Python 在timedatetime 中提供了它。
【解决方案2】:

如果要查看当前日期时间:

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")"

【讨论】:

  • 这只会检查里面的数据,但我也需要检查括号。例如,这也将验证x2012-02-11 17:15:00)...不幸的是(让我们用“x”切换括号)echo "x2012-02-11 17:15:00x" | grep "$(date -d "x2012-02-11 17:15:00x" "+x%Y-%m-%d %H:%M:%Sx")" 不起作用
  • 我想修改我的问题以便更好地理解,但我只是不知道如何......你知道我想要完成什么吗?
  • 好吧,只需在日期说明符中添加括号:grep "$(date -d "2012-02-11 17:15:00" "+(%Y-%m-%d %H:%M:%S)")" 如果您需要其他答案,我认为输入示例会有所帮助。
  • 但请注意,您删除了 -d 选项中的括号。这就是问题所在。可能有括号 - 你删除了 - 但也有 xxx 或其他。用户指定的任何内容。我将添加一些示例。
【解决方案3】:

我会采取蛮力的方法:用相应的正则表达式替换任何 %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

【讨论】:

  • 哦,这太残酷了……看起来没有比这更好的了
猜你喜欢
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多