【问题标题】:Parse date timestamp in SQL filename using RegEx使用 RegEx 解析 SQL 文件名中的日期时间戳
【发布时间】:2013-03-11 01:49:07
【问题描述】:

我正在构建一个用于备份数据库的 bash 脚本。我已经设置了一个 cron 作业来每天运行这个脚本,并且我已经可以根据以下格式转储 .sql 文件:

YYYYMMDD_HHMMSS-databasename.sql

考虑到时间戳格式的名称,我想构建另一个 bash 脚本来解析 YYMMDD 文件名部分并选择上周的所有每日文件。这个新的 bash 脚本将每周运行一次。

如何使用正则表达式将这些数字解析为日期?

【问题讨论】:

    标签: regex bash parsing


    【解决方案1】:

    这里有一个完整的解决方案,尝试这样做:

    没有 regexoffset cut(假设您的示例对于所有文件都是相同的格式,就像在 crontab 中运行的脚本一样):

    cd /path/to/dumps
    str='20130321_145907-databasename.sql'
    for i in {7..14}; do
        curfile=$(date -d ${str:0:8} -d "$i days ago" '+%Y%m%d')*
        if [[ -s $curfile ]]; then
            # do something with "$curfile"
        fi
    done
    

    如果你真的需要一个正则表达式

    cd /path/to/dumps
    str='20130321_145907-databasename.sql'
    if [[ $str =~ ^([0-9]{8})_[0-9]{6} ]]; then
        for i in {7..14}; do
            curfile=$(date -d ${BASH_REMATCH[1]} -d "$i days ago" '+%Y%m%d')*
            if [[ -s $curfile ]]; then
                # do something with "$curfile"
            fi
        done
    fi
    

    注意

    • 注意curfile= 行上的最终全局*

    【讨论】:

      【解决方案2】:

      使用 bash 3+:

      $ file=20130321_foo.log
      $ [[ $file =~ ^[0-9]{8} ]]
      $ echo ${BASH_REMATCH[0]}
      20130321
      $
      

      【讨论】:

      • 他想选择每日文件,这不会有太大帮助。请尝试完成它
      • OP 的问题是 “如何使用正则表达式将这些数字解析为日期?” 听起来他知道如何完成剩余的工作yyyymmdd 部分。 :)
      【解决方案3】:

      这个怎么样?

      LAST_WEEK_BEG=$(date --date="-7 days" +%Y%m%d)
      LAST_WEEK_END=$(date --date="-14 days" +%Y%m%d)
      
      
      if [ $YOUR_DATE -ge "$LAST_WEEK_BEG" ] && [ $YOUR_DATE -le "$LAST_WEEK_END" ]; then
         do things
      fi
      

      【讨论】:

      • 用 KlarKW 回答完成 ;)
      • -1 用于解析lsls 是一个交互式查看文件信息的工具。它的输出是为人类格式化的,并且会导致脚本中的错误。了解原因:mywiki.wooledge.org/ParsingLs
      • @fedorqui : 你看到my answer ?
      • 我当然做到了,@sputnick 并且喜欢它。无论如何,解析ls 有什么不好?好的,现在我看到你更新了你的第一条评论。
      • 这是一篇有趣的文章。由于我不想从您的帖子中复制,我只是回滚到我考虑上周限制的第一个答案,所以我认为您可以取消投票,@sputnick。很高兴知道这个关于ls的问题!
      【解决方案4】:

      使用正则表达式从文件名中选择日期部分:

      ^(20[12]\d)(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])_\d+-\w+\.sql$
      

      在这里解释正则表达式:http://regex101.com/r/iU7wL5

      更新 也有正确的时间验证

      ^(20[12]\d)(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])_([01]\d|2[0-3])[0-5]\d[0-5]\d-\w+\.sql$
      

      解释演示:http://regex101.com/r/yV1dD7

      注意:这适用于 2010-2029 范围内的日期,并将文件名验证为您的输出格式

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-12
        • 2018-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-14
        • 1970-01-01
        相关资源
        最近更新 更多