Как найти номера строк в двоичном файле?

932
WilliamKF

Я использую Centos 5 Linux и использую GNU grep v2.5.1 и смотрю файл журнала объемом 36 ГБ. Он огромен, и мне нужно найти около миллиона строк, начиная с появления строки 6307459в файле журнала, и просмотреть ее в emacs. Я использую, grepчтобы найти номер строки вхождения, а затем использую headи, tailчтобы получить раздел, который я заинтересован в рассмотрении. Проблема, с которой я сталкиваюсь, заключается в том, что она 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 в файле, чтобы я мог использовать headи tailпросмотреть 20 строк до шаблона и 1 000 000 после шаблона?

0
См. [Как я могу выполнить поиск в двоичных файлах, которые выглядят как текст?] (Http://serverfault.com/questions/328101/how-do-i-grep-through-binary-files-that-look-like-text ) на сервере SE kenorb 9 лет назад 0

1 ответ на вопрос

0
WilliamKF

Per s g's linked answer from serverfault, passing -a to grep forces binary files to be treated as text files. Here is the detailed solution:

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

Using the found line number of 171560394, I then created the following command to get a million lines starting at 100 lines before the found pattern so that I can view it in 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 

Похожие вопросы