Используем потоковый текстовый редактор sed в Linux

Многие из Вас наверняка применяли потоковый текстовый редактор sed для каких-то своих целей, если нет — я буду рад Вам о нем рассказать, постараюсь подробней. Почему называется — потоковым? Ответ прост — представьте входной текстовый документ который проходит через программу и в итоге получается некая другая форма данного файла, обработанного программой. Своего рода мясорубка — кладешь мясо, исходя из сетки — получаешь либо фарш либо что-то иное.

Итак, по умолчанию вроде как данная утилита уже должна быть у Вас в системе (в моем случае в Debian 7.6 она уже у меня была), если нет, то —

Для примера, создадим текстовый файл:

С текстом:

Перейдем к самому основному использованию ‘sed’ — замена текста в файле, формат запуска таков:

параметр «s» в начале указывает что нужно заменить текст, g — в конце заменяемого текста — то что необходимо это сделать глобально (по всему файлу)

К примеру, мы хотим в нашем файле text.txt заменить слово Sergey на Andrey и все это выгрузим в файл textout.txt, действуем:

Результат:

sed_uchim1

Если хотите делать замены на специальные символы — к примеру на символ &, то необходимо перед спец. символом поставить обратный слэш «\», если необходимо указать что нужно sed’у обратить на начало строки, используется спец символ «^». Кроме того, в одной строке можно написать 2 и более изменений разделив их точкой с запяток — «;». К примеру, мучаем уже измененный файл textout.txt. Для начала покажу текущее содержание файла textout.txt ещё раз:

Теперь вводим команду:

Тем самым нас вместо слова for ставиться значок & (спец символ вводиться с символом «\» перед спецсимволом), затем знак разделения (чтобы все изменения написать в одной строке sed’а -> «;» , вместо слова в начале строки «Test» ставиться слово Sergey, итог того что получилось:

sed_uchim2

Все как мы и хотели!

Так, же sed является хорошим помощником при просмотре логов. К примеру нам необходимо выгрузить все строки сегодняшней даты (пусть в нашем случае это 10 октября) из файла с логами /var/log/messages в файл testlog.txt, приступим:

тут у нас добавился параметр -n , а далее — ‘/^Oct 10/ — имеется ввиду что строка должна начинаться с даты 10 октября, далее параметр p — означающий print (печать содержимого при данном условии), далее файл источник и файл куда мы скинем результаты по нашему условию фильтра, запускаем, смотрим, что файл testlog.txt у нас содержит исключительно 10 октября:

sed_uchim3

Отлично! Если много строк не нужно, а условно есть необходимость взять только с первой по пятую строку, разделяем наш текущий запрос знаком «|» убирая выгрузку в файл testlog.txt и пишем sed -n 1,5p  — что значит что нам нужно вывести (p — print в конце выражения) с первой «1» по (через запятую) пятую «5» строку. Итого у нас получиться нечто следующее:

Ещё раз обращаю внимание что файл куда мы выгружаем результаты — перенесен в конец (testlog-5strok.txt), видим результат наших деяний:

sed_uchim4

Далее, часто случаются случаи когда админа бесит куда ненужных строк в файле конфигурации,ну к примеру — муторное описание файла php.ini :

sed_uchim5

И хочется чтобы конфиг содержал исключительно кофигурацию, а не ту ненужную массу комментов, которая в нем существует. Обращаем внимание что закоменченные строки в файле php.ini у нас отображаются значком «;» в начале каждой строки, что ж удалим их к черту, а после этого, отчистим файл от пустых строк, к примеру таким образом:

Объясняю, сначала sed ищет в начале строки спец символ «;» (так как нам нужно дать понять что этот символ нужно искать sed’у, а не обрабатывать как команду-разделитель, мы ставим перед точкой запятой обратный слеш  «\» ) , далее , мы видим новый параметр /d — delete, значит удаление строки по результатам поиска с учетом фильтра. После чего, через знак разделитель «|’ опять запускаем sed, где показываем ему, что после этого, нужно найти пустые строки (отображаются они вот так «^$») и после этого удалить и их «/d» , попутно сохранив файл в новое название phpnew.ini. Результат ДО мы видели на картинке выше, посмотрим результат после (в файле phpnew.ini) :

sed_uchim6

Как мы видим, все красиво и без лишнего мусора! По мне так, получилось не плохо :)

Summary
Article Name
Использование sed для работы с файлами linux
Description
Подробное описание с скриншотами - как использовать sed в условиях работы в Linux. Конкретно - замена символов, удаление строк, выборка из файла, удаление строк по параметрам
Author
comments powered by HyperComments