用例:您有一整周的多 GB 日志文件,并且您需要使用例如grep
.做出有根据的猜测,您假设从文件中间开始搜索将使处理时间减少一半以上(因为它肯定不需要处理文件的整个其余部分),同时不跳过任何相关数据。这可能吗?
答案1
假设您的数据按时间顺序排列:
- 通过查找到末尾并执行以下操作来获取文件的大小
ftell()
; - 将结果除以 2;
- 用于
fseek()
寻找该位置; - 通过调用一次查找下一行的开头
getline()
; - 用于
strptime()
了解您当前的日期; - 进行二分查找,重复步骤 4 和 5,直到找到所需的行。
答案2
您可以dd
按照以下方式使用:
dd if=log skip=xK bs=1M
这将跳过 x * 1024 个大小为 1M (2^20) 的块。dd(1)
有关单位处理的详细信息,请参见参考资料。
如果您想自动进行二分搜索,假设您的日志具有通常的格式,<date> [data]
您可以将输出通过管道传输到head -n 2
,请检查日志开头的日期第二线(在“通常”长线的合理假设下 - 将完成)并决定您想要哪一半。
答案3
获取文件大小并除以 2。将其除以 1024 即可得到 KiB。 (或 1024*1024 以获得 MiB 等)
((fs = $(stat -c %s logfile) / 2 / 1024))
跳过并搜索
dd if=logfile bs=1024 skip=$fs | grep blahblah
如果日志文件是,您可以进一步扩展这一点非常与 pr 的数据量一致。天通过添加一个count=
值到dd
.
((cnt = $(stat -c %s logfile) / 5 / 1024))
dd if=logfile bs=1024 skip=$fs count=$cnt | grep blahblah
这将cnt * 1024
在偏移字节处传输数据字节fs * 1024
。
将其全部包装在一个脚本中,并在脚本外部执行管道连接到 grep、临时文件或您想要的任何内容。
答案4
目前还不清楚你到底想做什么以及我的“过程”是什么意思。对于大文件,我最喜欢的交互式程序是less
.它可以毫无问题地处理大文件。它还可以跳到特定的百分比,例如使用30%
。此外,您可以使用/
和进行搜索?
。