bash - 如何使用 sed 搜索日期之间的日志

标签 bash awk sed

我试图在 grep 特定行的同时搜索一些日志。如何按日期和时间进一步减少以下日志?例如 2018/02/27 13:10:31 到 2018/02/27 13:17:34 之间的所有行。我尝试过使用 sed,但无法让它在任一日期列上正常工作。

grep "Eps=" file.log

INFO   | jvm 3    | 2018/02/27 13:02:27 | [Tue Feb 27 13:02:27 EST 2018] [INFO ] {Eps=5618.819672131148, Evts=2077762260}
INFO   | jvm 3    | 2018/02/27 13:03:27 | [Tue Feb 27 13:03:27 EST 2018] [INFO ] {Eps=5288.8, Evts=2078079588}
INFO   | jvm 3    | 2018/02/27 13:04:27 | [Tue Feb 27 13:04:27 EST 2018] [INFO ] {Eps=5176.633333333333, Evts=2078390186}
INFO   | jvm 3    | 2018/02/27 13:05:28 | [Tue Feb 27 13:05:28 EST 2018] [INFO ] {Eps=5031.633333333333, Evts=2078692084}
INFO   | jvm 3    | 2018/02/27 13:06:28 | [Tue Feb 27 13:06:28 EST 2018] [INFO ] {Eps=5047.433333333333, Evts=2078994930}
INFO   | jvm 3    | 2018/02/27 13:07:30 | [Tue Feb 27 13:07:29 EST 2018] [INFO ] {Eps=5314.183333333333, Evts=2079313781}
INFO   | jvm 3    | 2018/02/27 13:08:31 | [Tue Feb 27 13:08:31 EST 2018] [INFO ] {Eps=5182.934426229508, Evts=2079629940}
INFO   | jvm 3    | 2018/02/27 13:09:31 | [Tue Feb 27 13:09:31 EST 2018] [INFO ] {Eps=5143.459016393443, Evts=2079943691}
INFO   | jvm 3    | 2018/02/27 13:10:31 | [Tue Feb 27 13:10:31 EST 2018] [INFO ] {Eps=5519.266666666666, Evts=2080274847}
INFO   | jvm 3    | 2018/02/27 13:11:31 | [Tue Feb 27 13:11:31 EST 2018] [INFO ] {Eps=5342.8, Evts=2080595415}
INFO   | jvm 3    | 2018/02/27 13:12:32 | [Tue Feb 27 13:12:32 EST 2018] [INFO ] {Eps=5230.183333333333, Evts=2080909226}
INFO   | jvm 3    | 2018/02/27 13:13:32 | [Tue Feb 27 13:13:32 EST 2018] [INFO ] {Eps=4975.533333333334, Evts=2081207758}
INFO   | jvm 3    | 2018/02/27 13:14:32 | [Tue Feb 27 13:14:32 EST 2018] [INFO ] {Eps=5225.283333333334, Evts=2081521275}
INFO   | jvm 3    | 2018/02/27 13:15:33 | [Tue Feb 27 13:15:33 EST 2018] [INFO ] {Eps=5261.766666666666, Evts=2081836981}
INFO   | jvm 3    | 2018/02/27 13:16:34 | [Tue Feb 27 13:16:34 EST 2018] [INFO ] {Eps=5257.688524590164, Evts=2082157700}
INFO   | jvm 3    | 2018/02/27 13:17:34 | [Tue Feb 27 13:17:34 EST 2018] [INFO ] {Eps=5634.133333333333, Evts=2082495748}
INFO   | jvm 3    | 2018/02/27 13:18:34 | [Tue Feb 27 13:18:34 EST 2018] [INFO ] {Eps=5490.5, Evts=2082825178}
INFO   | jvm 3    | 2018/02/27 13:19:35 | [Tue Feb 27 13:19:35 EST 2018] [INFO ] {Eps=5351.05, Evts=2083146241}
INFO   | jvm 3    | 2018/02/27 13:20:37 | [Tue Feb 27 13:20:37 EST 2018] [INFO ] {Eps=5022.983606557377, Evts=2083452643}
INFO   | jvm 3    | 2018/02/27 13:21:37 | [Tue Feb 27 13:21:37 EST 2018] [INFO ] {Eps=5302.196721311476, Evts=2083776077}
INFO   | jvm 3    | 2018/02/27 13:22:37 | [Tue Feb 27 13:22:37 EST 2018] [INFO ] {Eps=5096.2, Evts=2084081849}
INFO   | jvm 3    | 2018/02/27 13:23:37 | [Tue Feb 27 13:23:37 EST 2018] [INFO ] {Eps=5074.45, Evts=2084386316}
INFO   | jvm 3    | 2018/02/27 13:24:38 | [Tue Feb 27 13:24:38 EST 2018] [INFO ] {Eps=5264.566666666667, Evts=2084702190}

最佳答案

像 sed 或 grep 这样的工具对字符串进行操作,即使您可以使用正则表达式做非常复杂的事情。 但这些工具缺乏对日期等内容执行“范围查询”之类的功能。

你可能会找到这个问题的各种解决方案,我的将包括一个小的Python片段:

#!/usr/bin/env python  
import sys
from datetime import datetime
begin = datetime(2018,2,27,13,10,31) 
end = datetime(2018,2,27,13,47,34)
for line in sys.stdin.readlines():
    if begin <= datetime.strptime(line.split('|')[2].strip(),'%Y/%m/%d %H:%M:%S') <= end:
        print(line[:-1])

将片段保存为 filter.py 并使其可执行(例如 chmod +x),然后可以像这样调用:

grep "Eps=" file.log | filter.py

关于bash - 如何使用 sed 搜索日期之间的日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49017473/

相关文章:

javascript - 如何使用 bash 运行 JSLint?

linux - 为什么不同的环境在调用man -ls 时包含不同的命令行选项? (环境 : codecademy, cb.vu)

linux - Bash - 使用双方括号和单方括号时

linux - 将列转置为格式化输出 :

regex - 我怎样才能使这个 sed 捕获完成更复杂的替换

linux - logrotate 没有运行 prerotate 脚本

linux - 从一个表中的多行获取输出

linux - shell 脚本。分割线

bash - 使用 sed 或 awk 从绝对路径中提取目录名称

linux - 使用 sed 获取日期