linux - 使用匹配时间范围和模式的 sed 命令提取数据
问题描述
我想从一个大的日志文件(大约 10GB)中提取行并将数据复制到一个单独的文件中。输出应与给定的时间范围和给定的文本匹配。
我尝试了以下仅与时间范围匹配的命令,但整个内容正在复制到文件中而没有过滤。(然后我想 grep 给定的文本形式 mycopy 文件。)
sed '/2020-07-21 17:28:00/,/2020-07-21 17:44:00/w mycopy' myLogFile > mycopy
如果我可以同时包含要匹配的文本,那就更好了,但我不明白该怎么做。我想要类似的东西。
sed '/givenTextTobeMatched/2020-07-21 17:28:00/,/2020-07-21 17:44:00/' myLogFile > mycopy
你对此的回应真的很感激。
解决方案
仅当开始时间和结束时间都出现在日志文件中时,使用正则表达式来识别时间范围才有效。如果在 17:44:00 没有记录任何内容,sed
则将复制整个文件的其余部分,因为永远不会满足结束条件。如果您不能保证每秒都有日志事件,可能会切换到更高级别的语言,例如 Awk。
语法上
sed '/2020-07-21 17:28:00/,/2020-07-21 17:44:00/!d;/givenTextTobeMatched/!d' myLogFile
会做你所要求的。注意否定;首先,我们删除范围之外的行,而不是与模式不匹配的行。(在某种意义上
sed -n '/2020-07-21 17:28:00/,/2020-07-21 17:44:00/{
/givenTextTobeMatched/p
}' myLogFile
可能更惯用和合乎逻辑,但更难便携地挤在一条线上。)
推荐阅读
- sql-server - 仅在 SQL Server 数据库中向具有主键列的表中插入记录
- architecture - RDBMS 可以像 noSQL 一样在读取上扩展吗?
- java - 我的 Spring Boot JAR 文件无法通过 Maven/Eclipse 部署,它总是关闭
- android - 如何拆分长文本以适合 Textview Android
- sql - Oracle SQL 中缺少 IN 或 OUT 参数
- google-sheets - 使用相对于前一列的数组公式生成序列号
- c# - ASP.Net Core 不完全本地化 - 已解决的语言
- javascript - 如何使用 JavaScript (jQuery) Ajax 从外部 URL 获取 JSON?
- telegram-bot - 如何在电报上创建一个机器人来向我显示股票新闻更新?
- python - python 在库中包装并从函数调用时请求为空?