UMGUM.COM (лучше) 

Vim + Sed ( Вычленяем из текстового файла блок строк посредством базового набору CLI-утилит. )

12 февраля 2015  (обновлено 3 февраля 2019)

OS: Linux/*BSD.

Задача: вычленить из текстового файла блок строк посредством базового набору CLI-утилит.

Такое часто случается - на удалённом сервере имеется действительно большой файл журнала событий, из которого требуется вычленить тоже немаленький кусок данных для последующей выгрузки и анализа в другой системе. Целиком файл не скопировать из-за его размеров (например, 900GB при канале передачи данных в 1-2Mbps), открыть в каком-то визуальном редакторе и скопировать строки через "буфер обмена" невозможно из-за ограниченного объёма ОЗУ (на проблемных серверах запросто может быть не более 1-2GB доступной оперативной памяти).

Простейший способ таков - открыть файл в консольном текстовом редакторе последовательного считывания, выяснить номера строк начала и завершения интересующего нас блока данных, после чего утилитой последовательной обработки файлов скопировать строки в нужном диапазоне.


Для открытия текстового файла удобнее всего воспользоваться утилитой "vim" (расширенный вариант "vi") - в её интерфейсе текущий номер строки и позиции курсора в таковой указывается в нижней правой части экрана. Вероятно, её потребуется установить - по умолчанию в системном комплекте приложений имеется только менее функциональная утилита "vi":

# aptitude install vim

Если приходится обходится "vi", то отображение строк включаем специальной командой (командный режим активируется последовательным вводом символов "Esc" и ":" ), уже после открытия файла - примерно так:

$ vi -n ./large-file

....
:set number

Посредством "vi" или "vim" открываем большой тестовый файл и находим (для вызова интерфейса поиска в старых Unix-утилитах используется символ "/") там строки начала и завершения нужного нам блока данных:

$ vim -n ./large-file

....
/string

Раз уж мы здесь разбираем вызов каждой команды "vi", то подскажу и способ выйти из него без сохранения изменений - последовательность "Esc", ":" и "q".

Для вычленения блока текстовых данных по имеющимся номерам строк воспользуемся утилитой "sed", поставляемой в комплекте абсолютно всех Linux-систем:

$ sed -n 11966,97423p ./large-file > ./part-of-large-file

Если сохранять эту часть файла в локальной файловой системе негде или незачем, то можно выгружать поток данных посредством SSH-туннеля на целевую Linux-станцию:

$ sed -n 11966,97423p ./large-file | ssh user@remotehost "cat > ./part-of-large-file"


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )