如何从偏移量处开始处理文件?

如何从偏移量处开始处理文件?

用例:您有一整周的多 GB 日志文件,并且您需要使用例如grep.做出有根据的猜测,您假设从文件中间开始搜索将使处理时间减少一半以上(因为它肯定不需要处理文件的整个其余部分),同时不跳过任何相关数据。这可能吗?

答案1

假设您的数据按时间顺序排列:

  1. 通过查找到末尾并执行以下操作来获取文件的大小ftell()
  2. 将结果除以 2;
  3. 用于fseek()寻找该位置;
  4. 通过调用一次查找下一行的开头getline()
  5. 用于strptime()了解您当前的日期;
  6. 进行二分查找,重复步骤 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%。此外,您可以使用/和进行搜索?

相关内容