我有一个非常大的日志文件(10+ GB)。我想找到最后一个表达式。是否可以使用标准posix命令执行此操作?
以下是一些潜在的答案,来自类似的问题,并不适合。
tail -n <x> <file> | grep -m 1 <expression>
:我不知道表达的距离有多远,所以我不知道<x>
会是什么。它可能是之前的几GB,所以你要拖尾整个文件。我想你可以循环并递增<x>
直到找到它,但是你会反复阅读文件的最后一部分。tac <file> | grep -m 1 <expression>
:tac读取整个源文件。一旦发现某些输出,就有可能将某些东西连接到sigkill tac上?这会有效吗?如果有帮助,表达式将锚定在一行的开头,例如:"^foo \d+$"
。
答案 0 :(得分:3)
你编写的任何脚本几乎肯定会慢于:
tac file | grep -m 1 '^foo [0-9][0-9]*$'
答案 1 :(得分:0)
此awk
脚本将搜索整个文件并打印与给定/pattern/
匹配的最后一行:
$ awk '/pattern/ { line=$0 } END { print $line }' gigantic.log
使用tac
将是一个更好的选择(这使用GNU sed
输出第一个(即最后一个)找到的匹配'/ pattern /',之后它终止,终止管道):
$ tac gigantic.log | gsed -n '/pattern/{p;q}'
使用Perl或C或其他语言,你可以寻找文件的末尾,退回4kb(或其他东西),然后
(除了寻找模式之外,这可能实际上是tac
的作用:one implementation of tac
)