linux - 如何从连续 yyyy-mm-dd 格式日期的报告中提取详细信息,直到在 unix 中找到下一个 yyyy-mm-dd 条目

标签 linux shell unix

我有一份报告(report.log),其中包含这样的条目

Following are access details for date: 2015-02-18
---------------------------------------------------

details1   
details2    
....   
....

Following are access details for date: 2015-02-19
----------------------------------------------------

line1                                                                        
line2   
....  
....

Following are access details for date: 2015-02-20
-------------------------------------------------------

line1                                                                        
line2   
....  
....

我想编写一个脚本,要求以 yyyy-mm-dd 格式输入单个日期(其输出应为以下是日期的访问详细信息:yyyy-mm-dd 直至并排除“以下是日期的访问详细信息”的新输入行)或范围,例如从 2014-02-09 到 2014-02-20(其输出应为以下是日期的访问详细信息:2014-02- 09 到(包括 2014-02-20 范围内的第二个日期),这意味着输出日期范围内从第一个日期到最后一个日期的所有条目。

另请注意报告中的...行之后和之前的新行

最佳答案

这是一个使用d1=$(date -d "somedate"+%s) 将秒转换为纪元的快速示例。然后是第二天d2=$((d1 + 86400))。这允许您在文件中找到包含第一个日期的行并读取所有行,直到找到第二天。如果您有任何疑问,请告诉我:

#!/bin/sh

dt1=$(date -d "$1" +%s)   # date provided by input
dt1f=$(date -d @$dt1 +%F) # date1 formatted in YYYY-MM-DD
dt2=$((dt1 + 86400))      # add one day to it
dt2f=$(date -d @$dt2 +%F) # date2 formatted in YYYY-MM-DD

ifn=${2:-loghdg.txt}      # input file

# printf "\nDate Range: %s - %s\n\n" "$(date -d @$dt1 +%F)" "$(date -d @$dt2 +%F)"
printf "\nDate Range: %s - %s\n\n" "$dt1f" "$dt2f"

# read each line in file
while read -r line; do

    arr=( $line )                   # read line into array
    for i in ${arr[@]}; do          # for each word in line
        [ $i == $dt1f ] && found=1  # if date1 found, print lines
        [ $i == $dt2f ] && found=0  # if date2 found, stop printing
    done

    [ "$found" == "1" ] && printf " %s\n" "$line"

done <"$ifn"

输入文件

$ cat loghdg.txt
Following are access details for date: 2015-02-18
details1
details2
....
....
Following are access details for date: 2015-02-19
line1
line2
....
....
Following are access details for date: 2015-02-20
line1
line2
....
....

输出/使用

$ sh date-day-diff.sh 2015-02-18

Date Range: 2015-02-18 - 2015-02-19

 Following are access details for date: 2015-02-18
 details1
 details2
 ....
 ....

接受开始结束日期的修改相当简单。

修改为接受开始+结束日期

dt1=$(date -d "$1" +%s)   # start date provided by input
dt1f=$(date -d @$dt1 +%F) # date1 formatted in YYYY-MM-DD
dt2=$(date -d "$2" +%s)   # end date provided by input
dt2f=$(date -d @$dt2 +%F) # date2 formatted in YYYY-MM-DD

ifn=${3:-loghdg.txt}      # input file

新输出

$ sh date-day-diff.sh 2015-02-18 2015-02-20

Date Range: 2015-02-18 - 2015-02-20

 Following are access details for date: 2015-02-18
 details1
 details2
 ....
 ....
 Following are access details for date: 2015-02-19
 line1
 line2
 ....
 ....

关于linux - 如何从连续 yyyy-mm-dd 格式日期的报告中提取详细信息,直到在 unix 中找到下一个 yyyy-mm-dd 条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28872264/

相关文章:

Linux/Unix命令确定进程是否正在运行?

r - 在 R 中捕获 At 命令的 ID

c - 统计信息未显示正确的 inode 号

c - 如何通过 popen 使用内置 shell 命令

bash - k8s CronJob 在 pod 列表上循环

linux - zsh提示功能不起作用

unix - 如何确保我的所有源文件都保持 UTF-8 且带有 Unix 行结尾?

linux - 文本文件列的算术运算

linux - 无法打开设备 : Too many open files Error

php - 使用 PHP 库进行 FFMPEG 音频合并