grep特定日期范围的文件中的数据

时间:2017-08-08 19:43:54

标签: unix awk sed grep

我正在尝试在给定日期范围内(2017年5月25日至2017年5月26日)搜索文件中的数据

2017-05-25 to 2017-05-26

它搜索数据但它也会搜索不在此日期范围内的其他数据。 我正在使用下面的命令。

sed -n '/2017-05-25/,/2017-05-26/p' /tmp/CGMJGFTS_FIN_NAM_PRODlog

看起来不错

1_V9AGGSWDC16_112_2017_05_25-160523_1001293_464.csv:"CGMJGFTS_FIN_NAM_PROD"!@#"PATROL_GC"!@#"169.177.208.155"!@#""!@#"4100"!@#"169.177.208.155"!@#"ISQL"!@#"PATMON"!@#"2017-05-24"!@#"2017-05-24"!@#"1"!@#"SYBASE"!@#"CONDB"!@#"2017-05-25 00:01:16"

但它也会搜索

@#"2"
1_V9AGGSWDC16_112_2017_05_28-160445_1001293_467.csv:"CGMJGFTS_FIN_NAM_PROD"!@#"PATROL_GC"!@#"169.177.208.155"!@#""!@#"4100"!@#"150.110.82.18"!@#"ISQL"!@#"DBA_LOCAL"!@#"**2017-05-27**

2 个答案:

答案 0 :(得分:0)

您当前的sed模式将在多行中查找匹配项。 (见@ twalberg'评论)。

如果您正在寻找包含两个日期(作为文字)的个别行,并假设所述日期是有序的(即,首先列出旧日期,后面列出的较新日期) ,您可以尝试使用单个正则表达式,例如:

sed -n '/2017-05-25.*2017-05-26/p' <filename>

例如:

$ cat tt
1.some_stuff.2017-05-24_some_more_stuff:2017-05-24;and the end
2.some_stuff.2017-05-25_some_more_stuff:2017-05-26;and the end   # should only find this row
3.some_stuff.2017-05-24_some_more_stuff:2017-05-26;and the end
4.some_stuff.2017-05-25_some_more_stuff:2017-05-27;and the end

$ sed -n '/2017-05-25.*2017-05-26/p' tt
2.some_stuff.2017-05-25_some_more_stuff:2017-05-26;and the end

当然除了sed之外你还有其他选择,例如:

$ egrep "2017-05-25.*2017-05-26" tt
2.some_stuff.2017-05-25_some_more_stuff:2017-05-26;and the end

$ awk '/2017-05-25.*2017-05-26/ {print}' tt
2.some_stuff.2017-05-25_some_more_stuff:2017-05-26;and the end

另一方面,如果您正在寻找sed来查找日期(作为文字)在2个搜索日期范围内的各行,sed不知道关于日期数学/比较的任何事情(同样的事情,@ twalberg&#39; s评论)。

如果以上都不能解决您的问题,那么您需要编辑您的问题,以提供您正在尝试完成的更多详细信息。为此,我建议您查看How to create a Minimal, Complete and Verifiable example

答案 1 :(得分:0)

我认为,您希望打印那些日期为2017-05-252017-05-26的行。如果我正确,那么以下命令可能会对您有所帮助。 :)

egrep "(2017-05-25.*|2017-05-26.*)" file