如何使用shell脚本从文件读取中的特定日期获取上一个日期

如何使用shell脚本从文件读取中的特定日期获取上一个日期,shell,Shell,在这里,我试图找出给出日期的前一个日期 previousDay=`date +"%Y-%m-%d" -d "-1 day"` finish_time1=$(grep -o -m1 "$previousDay [0-9][0-9]:[0-9][0-9]:[0-9][0-9]" sample.txt) [编辑2:尝试回答真正的问题:在给定日期的情况下,查找该日期之前的最后一行日志…] 2013-11-07 15:53:49 HB Thread alive (1) 2013-11-

在这里,我试图找出给出日期的前一个日期

previousDay=`date +"%Y-%m-%d" -d "-1 day"`
finish_time1=$(grep -o -m1  "$previousDay [0-9][0-9]:[0-9][0-9]:[0-9][0-9]" sample.txt)

[编辑2:尝试回答真正的问题:在给定日期的情况下,查找该日期之前的最后一行日志…]

    2013-11-07 15:53:49 HB Thread alive (1)
    2013-11-07 15:53:49 heartBeatCallback starting fireHeartBeat
    2013-11-07 15:53:50 refreshPollingTime END
    2013-11-07 15:53:50 heartBeatCallback testing childpid
    2014-01-24 15:53:50 heartBeatCallback end
    2014-01-25 15:53:50 HB end callback call
    2014-01-25 15:53:50 uploadTSLog TS_LOG_FILE is /public/tmp/testomatic/ts_logs/2013-11-   07_08-21-19_ONEOS90-VOIP_SIP_11N_FT-V5.1R5E12_NB83163_FT4_T10_112741.log
    2014-01-27 15:53:50 uploadTSLog: no new logs to upload
    2014-01-27 15:54:50 HB going to sleep */
下面:出于历史原因,我先前的回答是,认为您想要给定日期的“前一天”====

[编辑:这是第1天,不是第2天。第2天只需60*60*24秒即可轻松修改]

你需要从日期中找到“第一天”

我让你做一些“男人约会”,所以我只给你程序,而不是确切的方式

只是

  • 将日期转换为“自纪元起的秒数”
  • 然后从中取出“超过一天,但少于2天”(例如,从中取出60*60*24秒+10000秒)
  • 它会给你一个时间(从纪元开始的秒数)在“day-1”范围内
  • 并将新的秒数从历元转换回相应的日期
完成 )
fi

我想知道给定日期的前一天。例如:给定日期是2014-01-27,我想知道前一天的下一天是2014-01-25不确定我是否答对了问题。。。如果给定的日期是2014-01-27,并且您想要
2014-01-25
,为什么不将
“-1天”
部分更改为
“-2天”
?不,我已经在文件中搜索了日期的前一天,在发布的示例中,我以昨天为给定日期,试图找出文件中的前一天,但迄今为止还没有被接受的答案。任何人都可以告诉我如何从文件中找到前一天感谢您的答案@Olivier Dulac,但我动态地搜索了文件中任何给定日期的前一天,在发布的示例中,我将昨天作为给定的日期,并试图找出表中的前一个日期file@user3165241:确定“日期1”后,只需使用“日期+…”检索日期、月份和年份的信息,并使用这些信息在文件中grep。文件必须以相反的顺序读取,以找出小于给定日期的日期。。或者读取文件,同时将“上一行”保留在内存中,当到达当前日期时,打印“上一行”。。。我想你问错问题了。我现在才明白你真正想做什么:在一个日志文件中,找到给定的日期,最后一行“就在”那个日期之前。可能是第N-1天,或者第N-10天,随便什么。。。我会提出一个答案。
Date="2014-01-24"
awk -v d=$Date  '
   ($1 < d) { previous=$0 ; }
   ($1 >=d) { print previous ; exit ; }
     ' sample.txt
2013-11-07 15:53:50 heartBeatCallback testing childpid
finish_time=0
previousDay=`date +"%Y-%m-%d" -d "-1 day"`
if [ $finish_time -eq 0 ]; then
tac logfile.txt | 
(
while read line
do
finish_time=`echo $line | sed -e 's/\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9] [0-9]:[0-9][0-9]:[0-9][0-9]\).*/\1/'`
file_content_date=`date -d "$finish_time" +%Y%m%d`
comparison_prev_date=`date -d "$previousDay" +%Y%m%d`
if [ $comparison_prev_date -ge $file_content_date ]; then
comparison_end_date=$(date -d "$file_content_date" +%Y%m%d)
break
fi