如何在bash中计算日期范围内文件的行数?

时间:2016-06-30 14:10:47

标签: bash shell centos

我在服务器上使用centos并且我想在特定日期范围内计算文件的多行?我正在尝试调试我的程序。

2016-06-30T14:09:06+00:00
2016-06-30T14:09:06+00:00
2016-06-30T14:09:06+00:00
2016-06-30T14:09:06+00:00
2016-06-30T14:09:06+00:00
2016-06-30T14:09:07+00:00
2016-06-30T14:09:07+00:00
2016-06-30T14:09:07+00:00
2016-06-30T14:09:08+00:00
2016-06-30T14:09:08+00:00

如果我想计算从2016-06-30T14:09:06+00:00 - 2016-06-30T14:09:08+00:00开始的日期范围内该文件中有多少行,那么现在数据会是这样的。那可能吗?

结果应为10

2 个答案:

答案 0 :(得分:4)

只需正常比较它们:您可以使用字母数字比较比较您的时间戳并获得正确的答案 - 这是ISO 8601符号source)的美妙。

awk -v ini="2016-06-30T14:09:06+00:00" -v end="2016-06-30T14:09:08+00:00" \
 '$0>=ini && $0<=end {sum++} END{print sum}'

使用您的文件:

$ awk -v ini="2016-06-30T14:09:06+00:00" -v end="2016-06-30T14:09:08+00:00" '$0>=ini && $0<=end {sum++} END{print sum}' file
10

更具代表性的输入:

$ cat t
2015-06-30T14:09:06+00:00
2016-06-29T14:09:06+00:00
2016-06-30T14:09:05+00:00
2016-06-30T14:09:06+00:00
2016-06-30T14:09:07+00:00
2016-06-30T14:09:07+00:00
2016-06-30T14:09:08+00:00
2016-06-30T14:09:09+00:00
2016-06-30T14:10:08+00:00
2016-07-30T14:09:08+00:00
$ awk -v ini="2016-06-30T14:09:06+00:00" -v end="2016-06-30T14:09:08+00:00" '$0>=ini && $0<=end' t
2016-06-30T14:09:06+00:00
2016-06-30T14:09:07+00:00
2016-06-30T14:09:07+00:00
2016-06-30T14:09:08+00:00

答案 1 :(得分:2)

使用带有grep标记的-c来获取实例数,这要归功于评论中的建议。

grep -c 2016-06-30T14:09:0[6-8]+00:00 file 

模式[6-8],一个正则表达式,用于匹配文件中2016-06-30T14:09:06+00:02016-06-30T14:09:08+00:0之间的所有日志。

使用grep获取内容,awk打印行数

grep 2016-06-30T14:09:0[6-8]+00:00 file | awk 'END{print NR}'
10

还可以使用bash字数wc util,这比评论中karakfa建议的awk快。

grep 2016-06-30T14:09:0[6-8]+00:00 file | wc -l
10