Bash脚本比较两个日期变量

时间:2011-05-05 09:06:29

标签: bash variables date compare

我正在尝试将用户给出的日期与文件中的日期进行比较,基本上是列出了大量日期和时间的文本文件。

例如,用户将输入日期,例如22/08/2007和1:00的时间,我需要脚本做的是计算文本文件中的日期在用户给出的日期之后

我设法通过将文本文件中的每个日期转换为unix时间戳然后比较两者来实现此目的。有没有办法简单比较bash中的两个日期?

提前致谢

5 个答案:

答案 0 :(得分:19)

GNU date命令可以将日期转换为自1970年以来的秒数。试试这个脚本:

#! /bin/bash
DATE=$(date -d "$3-$2-$1 01" '+%s')
COUNT=0
tr '/' ' ' | {
    while read D M Y ; do
    THIS=$(date -d "$Y-$M-$D 01" '+%s')
    if (( THIS > DATE )) ; then
        COUNT=$((COUNT + 1))
    fi
    done
    echo $COUNT
}

它需要三个参数和stdin中的原始日期:

for D in $(seq 19 25) ; do echo $D/08/2007 ; done | ./count.sh 22 08 2007
3

它将一直工作到2038年。; - )

答案 1 :(得分:4)

如果您不介意使用外部帮助工具,请查看我的dateutils

涵盖了您的用例
dgrep -i '%d/%m/%Y %H:%M' '>=2007-08-22 01:00:00' < FILE | wc -l

其中FILE是包含日期的文件,-i指定文件中使用的日期格式(我假设日期类似22/08/2007 01:00)。将打印匹配的行,因此计算它们将为您提供所需的信息。

答案 2 :(得分:2)

...为什么不简单地删除单个数字,将它们从最重要的数字重新排列到不太重要的数字,将它们组合成一个新的大数字然后比较另一个? :)假设您在$1$2都有一个日期,并假设日期格式为dd-mm-yyyy(添加小时和分钟是微不足道的):

d1=`echo "$1" | cut -d "-" -f 1`
m1=`echo "$1" | cut -d "-" -f 2`
y1=`echo "$1" | cut -d "-" -f 3`
date1="$y1$m1$d1"

d2=`echo "$2" | cut -d "-" -f 1`
m2=`echo "$2" | cut -d "-" -f 2`
y2=`echo "$2" | cut -d "-" -f 3`
date2="$y2$m2$d2"

if [ "$date1" -gt "$date2" ]; then
    #date1 > date2
else
    #date2 >= date1
fi

请注意,您需要为1位字段添加零,例如,此类日期将起作用:

01-01-2013

和这样的日期不会

1-1-2013

干杯: - )

答案 3 :(得分:1)

问题是日期的打印方式是字符串式,“1/1/2050 1:00”&lt; “2/1/1999 0:00”。而且由于脚本没有办法知道某些东西是日期时间而你没有这么说,你基本上将任何日期转换为可以比较的东西 - 要么你必须订购元素以便最重要的(年份)是第一个,等等(如ISO日期)或转换为数字。

答案 4 :(得分:1)

上面的命令以整数形式比较日期,并且在你比较同年的日期之前可以正常工作。

更好的想法是将日期分为dd,mm和yyyy的3个部分,然后进行比较。如下所示:

SYSDATE = date +%d%m%Y sys_dd = echo $sysdate|cut -c1,2 sys_mm = echo $sysdate|cut -c3,4 sys_yyyy = echo $sysdate|cut -c5-8

cd $ dir_source #moving在放置报告的目录中

for i in #reading目录中存在的所有文件,并与当前的sysdate进行比较 做 文件名= $ I FILEDATE = echo $filename| cut -d '_' -f1 file_dd = echo $filedate|cut -c1,2 file_mm = echo $filedate|cut -c3,4 file_yyyy = echo $filedate|cut -c5-8

if [$ sys_yyyy -lt $ file_yyyy] 然后 echo&#34;将来的cob文件,检查错误&#34; elif [$ sys_yyyy -gt $ file_yyyy] 然后 echo&#34; prev cob文件,将被删除&#34; 其他      如果[$ sys_mm -lt $ file_mm]      然后      echo&#34;将来的cob文件,检查错误&#34;      elif [$ sys_mm -gt $ file_mm]      然后      echo&#34; prev cob文件,将被删除&#34;      其他

      if [ $sys_dd -lt $file_dd ]
      then
      echo "future cob file, check for the error"
      elif [ $sys_dd -gt $file_dd ]
      then
      echo "prev cob file , to be removed"
      else
      echo "file date is same is cob date, retaining the file as it is"
      fi
 fi

网络连接