Быстрая команда Unix для отображения определенных строк в середине файла? - PullRequest
177 голосов
/ 10 октября 2008

Попытка отладить проблему с сервером, и мой единственный файл журнала - это файл журнала объемом 20 ГБ (даже без отметок времени! Почему люди используют System.out.println() для ведения журнала? В производстве?!)

Используя grep, я нашел область файла, на которую я хотел бы взглянуть, строка 347340107.

Кроме выполнения чего-то вроде

head -<$LINENUM + 10> filename | tail -20 

... что потребовало бы head для чтения первых 347 миллионов строк файла журнала, есть ли быстрая и простая команда, которая бы выводила строки 347340100 - 347340200 (например) на консоль?

обновление Я полностью забыл, что grep может печатать контекст вокруг совпадения ... это хорошо работает. Спасибо!

Ответы [ 18 ]

356 голосов
/ 10 октября 2008

Я нашел два других решения , если вы знаете номер строки, но больше ничего (нет возможности grep):

Предположим, вам нужны строки от 20 до 40,

sed -n '20,40p;41q' file_name

или

awk 'FNR>=20 && FNR<=40' file_name
101 голосов
/ 28 июня 2013
# print line number 52
sed -n '52p' # method 1
sed '52!d' # method 2
sed '52q;d' # method 3,  efficient on large files 

эффективный метод 3 для больших файлов

самый быстрый способ отображения определенных строк

68 голосов
/ 10 октября 2008

с GNU-grep вы можете просто сказать

grep --context=10 ...
23 голосов
/ 15 октября 2008

Нет, файлы не имеют строковой адресации.

Нет постоянного способа найти начало строки n в текстовом файле. Вы должны пройти через файл и считать новые строки.

Используйте самый простой / быстрый инструмент, который вам нужен для работы. Для меня использование head делает намного более разумным, чем grep, поскольку последнее намного сложнее. Я не говорю "grep медленно", это действительно не так, но я был бы удивлен, если бы он был быстрее, чем head для этого случая Это было бы ошибкой в ​​head, в основном.

19 голосов
/ 10 октября 2008

А как же:

tail -n +347340107 filename | head -n 100

Я не проверял, но думаю, что это сработает.

12 голосов
/ 10 октября 2008

Сначала я бы разделил файл на несколько более мелких, как этот

$ split --lines=50000 /path/to/large/file /path/to/output/file/prefix

и затем grep к полученным файлам.

11 голосов
/ 07 августа 2013

Я предпочитаю просто идти в less и

  • набрав 5 0 % , чтобы перейти к половине файла,
  • 43210 G для перехода к строке 43210
  • :43210 сделать то же самое

и все в таком духе.

Еще лучше: нажмите v , чтобы начать редактирование (конечно же, в vim!) В этом месте. Теперь обратите внимание, что vim имеет такие же привязки клавиш!

8 голосов
/ 07 июля 2016

Вы можете использовать команду ex, стандартный редактор Unix (теперь часть Vim), например,

  • отображать одну строку (например, 2-ую):

    ex +2p -scq file.txt
    

    соответствующий синтаксис sed: sed -n '2p' file.txt

  • диапазон строк (например, 2-5 строк):

    ex +2,5p -scq file.txt
    

    Синтаксис sed: sed -n '2,5p' file.txt

  • от заданной строки до конца (например, с 5-го по конец файла):

    ex +5,p -scq file.txt
    

    Синтаксис sed: sed -n '2,$p' file.txt

  • многострочный диапазон (например, 2-4 и 6-8 строк):

    ex +2,4p +6,8p -scq file.txt
    

    Синтаксис sed: sed -n '2,4p;6,8p' file.txt

Приведенные выше команды могут быть протестированы с помощью следующего тестового файла:

seq 1 20 > file.txt

Пояснение:

  • + или -c с последующей командой - выполнить команду (vi / vim) после прочтения файла,
  • -s - бесшумный режим, также используется текущий терминал в качестве выхода по умолчанию,
  • q, за которым следует -c - команда выхода из редактора (добавьте ! для принудительного выхода, например, -scq!).
5 голосов
/ 13 марта 2018

Получи подтверждение

ack --lines = имя файла конца-конца

4 голосов
/ 07 августа 2013

sed тоже нужно будет прочитать данные для подсчета строк. Единственный способ, которым ярлык был бы возможен, был бы контекст / порядок в файле, чтобы работать с ним. Например, если были строки журнала с предустановленной датой и временем ширины и т. Д. Вы можете использовать утилиту look unix для бинарного поиска по файлам для определенных дат / времени

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...