Я использую 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 после шаблона?

1 ответ1

0

Ответ s s g от serverfault, передавая -a в grep заставляет двоичные файлы обрабатываться как текстовые файлы. Вот подробное решение:

> 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .