【问题标题】:how do you through loop a certain date range你如何通过循环某个日期范围
【发布时间】:2014-01-29 04:09:42
【问题描述】:

我的目录中有基于日期但没有明显日期标记的文件。

File_yyyymmdd_record.log

这些在目录中存放了几年。 现在,如果这些只是数字,我需要做的就是获取差异并增加一个计数器来推送值

var=substring( File_yyyymmdd_record.log ) /* get the yyyymmdd part */
var2=substring( File2_yyyymmdd_record.log ) /* get the yyyymmdd part */
delta=var2-var1
set i=delta and loop through to get the values for all these recordID's ( record ID    is the yyyymmdd part ) 

问题是如果我在目录中有 2 个不同的月份和年份,比如 20131210 和 20140110 差异不会给该目录中的所有记录ID,因为当它溢出到下个月时,纯数字计算不适用-它应该是基于日期的计算。 我想要做的是使用 2 个输入参数到 shell

 shell.sh recordID1 recordID2

并基于这些,它将找到所有记录并将它们存储在某个地方并循环遍历每个记录作为这样的输入

find <dir> -iname recordID* ...<some awk and sed here> |
   while read recordID ;
   do <stuff >
   done

无论如何,这可以在两种情况下实现—— 首先是日期计算部分,另一个是存储这些记录 ID,以便我可以循环浏览它们。也许将它们回显到一个 tmp 文件是一劳永逸的。

对于日期计算部分 - 我试过这个并且它有效。但不确定它是否会在一段时间/情况下动摇

echo $((($(date -u -d 2010-04-29 +%s) - $(date -u -d 2010-03-28 +%s)) / 86400))

因此,将 recordID1 设为 20100328,我有 32 天的 recordID 可以在该目录中查找。 您必须将日期从 recordID1 提前 32 天并将它们存储在某个地方。 怎样才能做到最好。

【问题讨论】:

    标签: shell date sed awk range


    【解决方案1】:

    我明白了,你需要找出文件名在 20131210 和 20140110 之间的日志文件。 (无需转换为纪元时间)

    #! /usr/bin/bash
    
    sep=20131210 
    eep=20140110 
    
    find /DIR -type f -name "*.log" |while read file
    do
      d=${file:5:8}
      if [ "$d" -ge "$sep" ] && [ "$d" -le "$eep" ]; then
         do <stuff >
      fi
    done
    

    【讨论】:

      【解决方案2】:

      应该这样做:

      s=20130102 # start date
      e=20130202 # end date
      
      sep=$(date +"%s" -d"$s") # conv to epoch
      eep=$(date +"%s" -d"$e")
      for f in *.log; do
          d=$(date +"%s" -d$(sed -n 's/^[^_]*_\([^_]*\)_[^_]*.log/\1/p' <<< "$f"))
          if [ "$d" -ge "$sep" ] && [ "$d" -le "$eep" ]; then
              echo $f
          fi
      done
      

      【讨论】:

      • 例如这里是一个例如目录和内容/testdir contents : datalog.20131030.part.001 datalog20131030.part.002 datalog20120910.part.001 datalog20120910.part.002 datalog20130930.part.001 datalog20130930.part.002 shell.ksh 20130930 201310301 应该为 20130930 和 201310301 系列选择每个 part.001 和 part002 文件。隔离recordID - 这些和文件名的yyyymmdd。对于这个目录 - 再次给我匹配该范围的所有文件及其记录 ID(回显那些名称)TY
      猜你喜欢
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      相关资源
      最近更新 更多