Попытка отладить проблему с сервером, и мой единственный файл журнала - это файл журнала 20 ГБ (даже без отметок времени! Почему люди используют System.out.println()
для ведения журнала? В производстве ?!)
Используя grep, я нашел область файла, на которую я хотел бы взглянуть, строка 347340107.
Кроме того, чтобы делать что-то вроде
head -<$LINENUM + 10> filename | tail -20
... что потребует head
прочтения первых 347 миллионов строк файла журнала, есть ли быстрая и простая команда, которая выводит строки 347340100 - 347340200 (например) на консоль?
обновление Я полностью забыл, что grep может печатать контекст вокруг совпадения ... это хорошо работает. Спасибо!
Ответы:
с GNU-grep вы можете просто сказать
источник
Я нашел два других решения, если вы знаете номер строки, но больше ничего (нет возможности grep):
Предполагая, что вам нужны строки от 20 до 40,
или
источник
41q
проинструктируйте sed выйти из очереди41
.Метод 3 эффективен для больших файлов
самый быстрый способ отображения определенных строк
источник
Нет, файлы не являются адресно-строковыми.
Нет постоянного способа найти начало строки n в текстовом файле. Вы должны пройти через файл и считать новые строки.
Используйте самый простой / быстрый инструмент, который вам нужен для работы. Для меня использование
head
имеет гораздо больше смысла, чемgrep
, так как последнее намного сложнее. Я не говорю «grep
медленно», это действительно не так, но я был бы удивлен, если бы это было быстрее, чемhead
в этом случае. Это было бы ошибкой, вhead
основном.источник
Что о:
Я не проверял это, но думаю, что это сработает.
источник
Я предпочитаю просто войти
less
и:43210
сделать то же самоеи тому подобное.
Еще лучше: нажмите, vчтобы начать редактирование (в vim, конечно!), В этом месте. Теперь обратите внимание, что
vim
имеет такие же привязки клавиш!источник
Сначала я бы разделил файл на несколько таких маленьких
а затем grep на полученные файлы.
источник
Вы можете использовать
ex
команду, стандартный редактор Unix (теперь это часть Vim), напримеротобразить одну строку (например, 2-ую):
соответствующий синтаксис sed:
sed -n '2p' file.txt
диапазон строк (например, 2-5 строк):
Синтаксис sed:
sed -n '2,5p' file.txt
от заданной строки до конца (например, с 5-го по конец файла):
Синтаксис sed:
sed -n '2,$p' file.txt
несколько строк (например, 2-4 и 6-8 строк):
Синтаксис sed:
sed -n '2,4p;6,8p' file.txt
Указанные выше команды могут быть протестированы с помощью следующего тестового файла:
Объяснение:
+
или-c
после команды - выполнить команду (vi / vim) после прочтения файла,-s
- тихий режим, также использует текущий терминал в качестве выхода по умолчанию,q
затем следует-c
команда для выхода из редактора (например, добавьте!
для принудительного выхода-scq!
).источник
Если ваш номер строки 100 читать
источник
Получить
ack
Установка Ubuntu / Debian:
Затем запустите:
Пример:
От
$ man ack
:источник
--lines
параметр был удален.Sed должен будет прочитать данные, чтобы посчитать строки. Единственный способ, которым ярлык был бы возможен, был бы контекст / порядок в файле, чтобы работать с ним. Например, если были строки журнала с предустановленной датой / временем ширины и т. Д., Вы можете использовать утилиту look unix для двоичного поиска в файлах по определенным датам / временам.
источник
использование
Здесь вы получите номер строки, где произошло совпадение.
Теперь вы можете использовать следующую команду для печати 100 строк
или вы можете использовать «седь»
источник
При этом
sed -e '1,N d; M q'
вы будете печатать строки от N + 1 до M. Это, вероятно, немного лучше, такgrep -C
как он не пытается сопоставить линии с шаблоном.источник
-e
здесь необязательно.Основываясь на ответе Sklivvz, вот хорошая функция, которую можно поместить в
.bash_aliases
файл. Он эффективен при работе с большими файлами при печати содержимого с начала файла.источник
Чтобы отобразить строку из
<textfile>
ее<line#>
, просто сделайте это:Если вы хотите более эффективный способ показать диапазон строк с регулярными выражениями - я не буду говорить, почему grep - плохая идея для этого, это должно быть довольно очевидно - это простое выражение покажет вам ваш диапазон в один проход, который вам нужен при работе с ~ 20 ГБ текстовыми файлами:
(Совет: если ваше регулярное выражение имеет
/
в нем, используйте что-то вродеm!<regex>!
этого)Это напечатало бы,
<filename>
начиная со строки, которая соответствует<regex1>
вплоть до (и включая) строку, которая соответствует<regex2>
.Не нужно волшебника, чтобы увидеть, как несколько настроек могут сделать его еще более мощным.
И последнее: Perl, поскольку он является зрелым языком, имеет множество скрытых улучшений, способствующих скорости и производительности. Имея это в виду, это делает очевидным выбор для такой операции, поскольку она изначально была разработана для обработки больших файлов журналов, текста, баз данных и т. Д.
источник
Вы можете попробовать эту команду:
источник
Легко с Perl! Если вы хотите получить строки 1, 3 и 5 из файла, скажите / etc / passwd:
источник
Я удивлен, что только один другой ответ (Рамана Редди) предложил добавить номера строк к выводу. Следующий поиск ищет требуемый номер строки и окрашивает вывод.
источник