在不读取整个文件的情况下以相反的顺序 Grep

Grep in reverse order without reading whole file

我有一个可能非常大的日志文件 (10+ GB)。我想找到表达式的最后一次出现。是否可以使用标准 posix 命令执行此操作?

以下是一些类似问题的可能答案,但不太合适。

如果有帮助,表达式将锚定在行首,例如:"^foo \d+$".

无论您编写什么脚本,几乎肯定会比以下脚本慢:

tac file | grep -m 1 '^foo [0-9][0-9]*$'

awk 脚本将搜索整个文件并打印匹配给定 /pattern/:

的最后一行
$ awk '/pattern/ { line=[=10=] } END { print $line }' gigantic.log

使用 tac 将是一个更好的选择(这使用 GNU sed 输出第一个(即最后一个)找到的匹配 '/pattern/',之后它终止,终止管道):

$ tac gigantic.log | gsed -n '/pattern/{p;q}'

使用 Perl 或 C 或其他语言,您可以查找到文件末尾,后退 4kb(或其他),然后

  • 向前读4kb,
  • 后退8kb
  • 重复直到找到模式,确保正确处理读取部分行。

(这个,除了寻找模式,实际上可能是 tac 所做的:one implementation of tac