Эти 5 команд Linux упрощают чтение больших файлов
Ключевые выводы
- Linux предоставляет инструменты для управления большими текстовыми файлами и нестабильными потоками данных.
- Используйте «меньше» для прокрутки, поиска и управления содержимым файла или прямого вывода в него.
- Разделяйте большие файлы с помощью функции разделения, эффективно управляйте частями и используйте «голову» и «хвост» для выборочного просмотра.
Если вам нужно найти информацию внутри очень больших текстовых файлов, Linux предоставляет все необходимые инструменты прямо из коробки. Вы также можете использовать их в прямых текстовых потоках.
Информационная перегрузка
Большую часть времени Linux очень сдержан. Вы должны исходить из того, что отсутствие новостей — это хорошие новости. Если ваша последняя команда не выдала сообщение об ошибке, можно считать, что все прошло хорошо.
В других случаях Linux может завалить вас информацией. До появления systemd и Journalctl инструменты и методы, которые мы собираемся здесь рассмотреть, использовались для укрощения разросшихся файлов журналов, но их можно применять к любому файлу.
Их также можно применять к потокам данных и выводу команд.
Использование меньшего количества
Команда less позволяет прокручивать файл вперед и назад построчно с помощью стрелок вверх и вниз или по экрану с помощью Page Up и Page Down, или переходить к началу или концу файла с помощью Home и Конец.
less words.txt
Вы можете добавить номера строк, если добавите параметр командной строки -N (номера строк).
less -N words.txt
Как видите, в этом файле сотни тысяч строк, но меньшее количество все равно довольно быстрое, даже на этой скромно оборудованной виртуальной машине.
Полезно, что less имеет функцию поиска. Нажмите косую черту /, введите ключ к поиску и нажмите Enter. Если есть совпадение, less отображает этот раздел файла с выделенным совпадением.
Вы можете переходить от матча к матчу, нажимая n. Чтобы сделать то же самое в обратном порядке, нажмите N.
Используя каналы, вы можете отправить вывод команды прямо в less.
sudo ls -R / | less
Как и в случае с файлом, вы можете прокручивать вперед и назад и искать строки.
Перенаправление потоков в файлы
Передача вывода команды в less отлично подходит для одноразовых нужд, но как только вы закроете less, вывод исчезнет. Если вам понадобится работать с этим выводом в будущем, вам следует сделать его постоянную копию и открыть копию в меньшем объеме.
Это легко сделать, перенаправив вывод команды в файл и открыв файл с помощью less.
sudo ls -R / > listing-capture.txt
Обратите внимание, что предупреждения или ошибки отправляются в окно терминала, чтобы вы могли их увидеть. Если бы они были отправлены в файл, вы могли бы их пропустить. Чтобы прочитать файл, открываем его меньшим способом обычным способом.
less listing-capture.txt
Оператор > перенаправляет вывод в указанный файл и каждый раз создает файл заново. Если вы хотите сохранить два (или более) разных набора информации в одном файле, вам нужно использовать оператор >> для добавления данных в существующий файл.
sudo ls -R /bin > listing-capture.txt
sudo ls -R /etc >> listing-capture.txt
Обратите внимание на использование >> во второй команде.
less listing-capture.txt
Перехватывая выходные данные команды, мы фактически захватываем один из трех потоков Linux. Команда может принимать входные данные (поток 0, STDIN), генерировать выходные данные (поток 1, STDOUT) и выдавать сообщения об ошибках (поток 2, STDERR).
Мы захватили поток 1, стандартный поток вывода. Если вы хотите также записывать сообщения об ошибках, вам необходимо одновременно захватить поток 2, стандартный поток ошибок. Нам нужно использовать эту странную конструкцию 2>&1, которая перенаправляет поток 2 (STDERR) в поток 1 (STDOUT).
sudo ls -R / > listing-capture.txt 2>&1
Вы можете искать в файле такие строки, как предупреждение, ошибка или другие фразы, которые, как вам известно, появляются в сообщениях об ошибках.
less listing-capture.txt
Разделение файлов на более мелкие фрагменты
Если ваши файлы настолько велики, что меньше тормозят и тормозят, вы можете разделить исходный файл на более удобные фрагменты.
У меня есть файл big-file.txt. В нем 132,8 миллиона строк текста, а его размер превышает 2 ГБ.
Открытие его в меньшем формате работает достаточно хорошо, если только вы не попытаетесь перейти прямо к началу или концу файла или не попытаетесь выполнить обратный поиск с конца файла.
Это работает, но медленно.
Вот почему у нас есть команда разделения. Как следует из названия, он разбивает файлы на более мелкие файлы, сохраняя исходный файл.
Вы можете разделить файл на определенное количество файлов меньшего размера или указать желаемый размер разделенных файлов, а разделение определяет, сколько файлов нужно создать. Но эти стратегии приведут к тому, что строки и даже слова будут разделены на два файла.
Поскольку мы работаем с текстом, а разбивать строки и разбивать слова будет проблематично, имеет смысл указать разделение по количеству строк. Ранее мы использовали команду wc, поэтому знаем, сколько у нас строк.
Я использовал опцию -l (строки) и указал 500 000 строк. Я также использовал параметр -d (цифры), чтобы иметь последовательную нумерацию файлов, и параметр -a (длина суффикса), чтобы числа дополнялись нулями до трех цифр. Слово «chunk» является префиксом для имен разделенных файлов.
split -l 500000 -d -a 3 big-file.txt chunk.
В нашем примере это создает 267 файлов (с номерами от 000 до 265), которыми легче управлять на компьютерах с небольшой мощностью.
wc chunk.001
wc chunk.002
wc chunk.080
wc chunk.265
Каждый файл содержит 500 000 полных строк, не считая последнего файла. В этом файле есть все, что осталось от количества строк.
Использование головы и хвоста
Команды head и Tail позволяют просмотреть выбранные строки сверху или в конце файла.
head chunk.199
tail chunk.199
По умолчанию вам показано 10 строк. Вы можете использовать опцию -n (строки), чтобы запросить больше или меньше строк.
head -n 15 chunk.199
tail -n 3 chunk.199
Если вы знаете интересующую вас область внутри файла, вы можете выбрать эту область, передав выходные данные от хвоста к заголовку. Единственная особенность заключается в том, что вам нужно указать первую строку региона, который вы хотите видеть, отсчитываемым назад от конца файла, а не вперед от начала файла.
В файле 500 000 строк. Если мы хотим увидеть 20 строк, начинающихся со строки 1240, нам нужно указать хвосту начинать со строки 500 000–1239, то есть 498761. Обратите внимание, что мы вычитаем число на единицу меньше, чем строка, с которой мы хотим начать.
Вывод передается в head, который отображает 20 верхних строк.
tail -n 498761 chunk.199 | head -n 20
Сравнивая выходные данные того же файла в less, отображаемые начиная со строки 1240, мы видим, что они совпадают.
В качестве альтернативы вы можете разделить файл по первой интересующей строке, а затем использовать head для просмотра верхней части нового файла.
Еще один трюк, который вы можете сделать с хвостом, — это отслеживать изменение данных. Если у вас есть файл, который обновляется как файл журнала, опция -f (следить за изменениями) указывает Tail отображать нижнюю часть файла при каждом его изменении.
tail -f changing.log
Фильтрация строк с помощью grep
Команда grep очень мощная. Самый простой пример использует grep для поиска строк в файле, содержащих строку поиска.
grep stereo chunk.045
Мы можем добавить номера строк с помощью опции -n (номера строк), чтобы мы могли найти эти строки в файле, если захотим. Опция -T (tab) сводит выходные данные в таблицу.
grep -n -T stereo chunk.045
Поиск по нескольким файлам так же прост.
grep -n -T pamstereogram.1.gz chunk.*
Имя файла и номер строки указаны для каждого совпадения.
Вы также можете использовать grep для поиска в потоках информации в реальном времени.
./log.sh | grep MemAvailable
Чем больше они приходят...
С grep вы можете экспериментировать сколько угодно и использовать регулярные выражения в строке поиска. Для всех показанных здесь команд я рекомендую просмотреть их справочные страницы. Они делают гораздо больше, чем я смог здесь описать, и некоторые другие их возможности могут быть полезны для вашего конкретного случая использования.