我有一个巨大的文件,我想用 grep 的简单过滤器显示它:
假设这是我的文件:
TIME0 random data
TIME1 random data
TIME2 INTERESTING LINE
TIME3 random data
TIME4 random data
TIME5 random data
TIME6 random data
TIME7 INTERESTING LINE
TIME8 random data
TIME9 random data
TIME10 random data
TIME11 INTERESTING LINE
TIME12 random data
我想显示INTERESTING LINE:
grep "INTERESTING LINE" myfile
这可行,但文件很大,包含数百万个INTERESTING LINE。我只需要最后一个:
tac myfile | grep -m3 "INTERESTING LINE"
这行得通,但是我怎样才能指定我只在某个TIME前缀之后才需要INTERESTING LINE ?(或直到某个时间)tac
因此,例如使用上面的示例文件,我如何才能从 myfile 中 grep 所有INTERESTING LINE从最后到TIME7?(所以不需要 TIME2 的有趣行):
TIME11 INTERESTING LINE
TIME7 INTERESTING LINE
订购并不重要,我可以接受 ASC 或 DESC 订购。
重要的是不要扫描整个文件,即从文件末尾逐行扫描。
我正在寻找一种为 grep 提供退出标准的方法(而不是用 定义最大结果数-m
)
使用
sed
而不是grep
更好地控制输入数据的解析:这将
tac
按照您的建议反转文件,并将反转的数据通过sed
.两种
sed
表达方式:/^TIME6 /q
, 一旦我们找到以 . 开头的行就退出TIME6
。您还可以使用/^TIME[0-6] /q
或任何与时间列匹配的表达式,这些时间列太旧而无法引起人们的兴趣。/INTERESTING LINE/p
, 打印与给定正则表达式匹配的所有行。效果是文件只被读取,直到我们发现时间戳太新。在解析过程中发现的任何有趣的行都会打印到标准输出。
如果您知道
TIME7
要搜索的确切时间戳,直到:如果感兴趣的话,这允许我们打印最后读取的行,即使它正是我们想要退出的时间戳。