如何用 grep 查找二进制文件中的行号?

如何用 grep 查找二进制文件中的行号?

我在 Centos 5 Linux 上使用 GNU grep v2.5.1 并查看一个 36GB 的日志文件。它非常大,我需要从6307459日志文件中出现字符串的位置开始查找大约一百万行,然后在 emacs 中查看它。我使用grep查找出现的行号,然后使用headtail获取我感兴趣的部分。我面临的问题是grep找到了行但没有提供给我,而是打印了关于它是二进制文件的消息:

> grep -n 6307459 /disk2/user/test/logs/2015-03-31-23-42-52-7224.log 
Binary file /disk2/user/test/logs/2015-03-31-23-42-52-7224.log matches

我想象日志文件中的某个地方有一些欺骗 grep 的控制字符,但文件的开头和结尾看起来像普通文本。

我尝试将其重命名为 /disk2/user/test/logs/2015-03-31-23-42-52-7224.log.txt,但它仍然说它是一个二进制文件。

我如何才能获得文件中出现模式 6307459 的行号,以便我可以使用headtail查看模式前 20 行和模式后 1,000,000 行?

答案1

每克来自 serverfault 的链接答案,传递-agrep强制将二进制文件视为文本文件。以下是详细解决方案:

> grep -a -n 6307459 /disk2/user/test/logs/2015-03-31-23-42-52-7224.log
171560394:Rcvd client's reconnect count 6307459.

使用找到的行号171560394,我创建了以下命令来获取从找到的模式之前 100 行开始的一百万行,以便我可以在 emacs 中查看它:

> head -n 172560294 /disk2/user/test/logs/2015-03-31-23-42-52-7224.log  \
  | tail -n 1000000 > /disk2/user/test/logs/2015-03-31-23-42-52-7224.log_mid

相关内容