你如何通过循环某个日期范围

时间:2014-01-29 04:09:42

标签: shell date sed awk range

我的目录中的文件是基于日期的,但没有明显的日期戳。

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 差异不会给gigme目录中的所有recordID,因为当它溢出到下个月时,普通数值计算不适用 - 它应该是基于日期的计算。 我想要做的是使用2个输入参数到shell

 shell.sh recordID1 recordID2

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

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

无论如何,这可以在2个背景下实现 - 首先是日期计算部分,另一个是存储这些记录ID,所以我可以循环它们。也许回应他们到tmp文件就是蝙蝠。

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

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

因此,如果将recordID1作为20100328,那么我在该目录中需要32天的recordID。 您必须从recordID1提前32天的日期并将它们存储在某个地方。 如何最好地完成这一切。

2 个答案:

答案 0 :(得分:1)

这样的事情应该做:

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

答案 1 :(得分: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