Поиск по сайту:

15 советов по использованию команды Sed для задач системного администрирования Linux


Каждому системному администратору ежедневно приходится иметь дело с обычными текстовыми файлами. Знание того, как просматривать определенные разделы, как заменять слова и как фильтровать контент из этих файлов, — это навыки, которые вам понадобятся без необходимости выполнять поиск в Google.

В этой статье мы рассмотрим sed, известный потоковый редактор, и поделимся 15 советами по его использованию для достижения упомянутых ранее целей и многих других.

Что такое команда СЭД?

Команда «sed», сокращенно от «редактор потоков», представляет собой универсальный и мощный инструмент для работы с текстом, который работает с текстовыми потоками и позволяет пользователям выполнять различные операции с данными, такие как поиск, замена, вставка и т. д. удалить. «Sed» использует регулярные выражения для определения шаблонов манипулирования текстом и может использоваться для задач пакетного редактирования и обработки текста в сценариях.

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

Ниже приведены некоторые распространенные команды «sed» с примерами:

1. Просмотр диапазона строк файла

Такие инструменты, как заголовок и хвост, позволяют нам просматривать нижнюю или верхнюю часть файла. Что делать, если нам нужно просмотреть раздел посередине? Следующий однострочный код sed вернет строки с 5 по 10 из tecmint.txt:

sed -n '5,10p' tecmint.txt

2. Просмотр всего файла, кроме заданного диапазона

С другой стороны, возможно, вы захотите распечатать весь файл, кроме определенного диапазона. Чтобы исключить строки с 20 по 35 из tecmint.txt, выполните:

sed '20,35d' myfile.txt

3. Просмотр непоследовательных линий и диапазонов

Возможно, вас интересует набор непоследовательных строк или несколько диапазонов. Давайте отобразим строки 5-7 и 10-13 из tecmint.txt:

sed -n -e '5,7p' -e '10,13p' tecmint.txt

Как видите, опция -e позволяет нам выполнить заданное действие (в данном случае — вывести строки) для каждого диапазона.

4. Замена слов или строк в файле

Чтобы заменить каждое слово version на story в tecmint.txt, выполните:

sed 's/version/story/g' tecmint.txt

Кроме того, вы можете рассмотреть возможность использования gi вместо g, чтобы игнорировать регистр символов:

sed 's/version/story/gi' myfile.txt

Чтобы заменить несколько пробелов одним пробелом, мы будем использовать вывод команды ip Route show с конвейером:

ip route show | sed 's/  */ /g'

Сравните вывод ip Route Show с конвейером и без него:

5. Замена слов или строк внутри диапазона

Если вы хотите заменить слова только в пределах диапазона строк (например, от 30 до 40), вы можете сделать следующее:

sed '30,40 s/version/story/g' tecmint.txt

Конечно, вы можете указать одну строку через соответствующий номер вместо диапазона.

6. Удаление комментариев из файла

Иногда файлы конфигурации загружаются с комментариями. Хотя это, безусловно, полезно, иногда может оказаться полезным отображать только директивы конфигурации, если вы хотите просмотреть их все сразу.

Чтобы удалить пустые строки или строки, начинающиеся с # из файла конфигурации Apache, выполните:

sed '/^#\|^$\| *#/d' httpd.conf

За знаком каретки следует знак номера. (^#) указывает на начало строки, тогда как ^$ представляет собой пустые строки. Вертикальные полосы обозначают логические операции, а обратная косая черта используется для выхода из вертикальных полос.

В данном конкретном случае файл конфигурации Apache содержит строки с #, которые не находятся в начале некоторых строк, поэтому *# также используется для их удаления.

7. Замените слово без учета регистра в файле

Чтобы заменить слово, начинающееся с прописной или строчной буквы, другим словом, мы также можем использовать sed. Для иллюстрации давайте заменим слово zip или Zip на rar в tecmint.txt:

sed 's/[Zz]ip/rar/g' tecmint.txt

8. Поиск определенных событий в файле журнала

Другое использование sed заключается в печати строк из файла, соответствующих заданному регулярному выражению. Например, нас может заинтересовать просмотр действий авторизации и аутентификации, которые произошли 2 июля, согласно файлу /var. /log/secure войти на сервер CentOS.

В данном случае шаблоном для поиска является 2 июля в начале каждой строки:

sed -n '/^Jul  1/ p' /var/log/secure

9. Вставка пробелов или пустых строк в файл

С помощью sed мы также можем вставлять пробелы (пустые строки) для каждой непустой строки в файле. Чтобы вставить одну пустую строку в каждую вторую строку в LICENSE, текстовом файле, выполните:

sed G tecmint.txt

Чтобы вставить две пустые строки, выполните:

sed 'G;G' tecmint.txt

Добавьте заглавную букву G, разделенную точкой с запятой, если вы хотите добавить больше пустых строк. Следующее изображение иллюстрирует пример, описанный в этом совете:

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

10. Удаление ^M в файле

Программа dos2unix преобразует обычные текстовые файлы из форматирования Windows/Mac в формат Unix/Linux, удаляя скрытые символы новой строки, вставленные некоторыми текстовыми редакторами, используемыми на этих платформах. Если он не установлен в вашей системе Linux, вы можете имитировать его функциональность с помощью sed вместо его установки.

На изображении слева мы видим несколько символов новой строки DOS (^M), которые позже были удалены с помощью:

sed -i 's/\r//' myfile.txt

Обратите внимание, что опция -i указывает на редактирование на месте. Тогда изменения не вернутся на экран, а сохранятся в файл.

Примечание. Вы можете вставлять символы новой строки DOS при редактировании файла в редакторе Vim с помощью Ctrl+V и Ctrl+M.

11. Создайте файл резервной копии с помощью команды Sed.

В предыдущем совете мы использовали sed для изменения файла, но не сохраняли исходный файл. Иногда на всякий случай полезно сохранить резервную копию исходного файла.

Для этого укажите суффикс после опции -i (в одинарных кавычках), который будет использоваться для переименования исходного файла.

В следующем примере мы заменим все экземпляры this или This (игнорируя регистр) на экземпляры в myfile.txt и сохраним исходный файл как myfile.txt.orig.

Наконец, мы воспользуемся утилитой diff, чтобы выявить различия между обоими файлами:

sed -i'.orig' 's/this/that/gi' myfile.txt

12. Переключение пар слов в файле

Предположим, у вас есть файл, содержащий полные имена в формате Имя, Фамилия. Чтобы правильно обработать файл, вы можете поменять местами Фамилия и Имя.

Мы можем сделать это с помощью sed довольно легко:

sed 's/^\(.*\),\(.*\)$/\, /g' names.txt

На изображении выше мы видим, что круглые скобки, являющиеся специальными символами, необходимо экранировать, как и цифры 1 и 2.

Эти числа представляют собой выделенные регулярные выражения (которые должны отображаться в круглых скобках):

  • 1 представляет начало каждой строки до запятой.
  • 2 — это заполнитель для всего, что находится справа от запятой до конца строки.

Желаемый вывод указывается в формате Второй столбец (Фамилия) + запятая + пробел + Первый столбец (Имя). Не стесняйтесь менять его на все, что пожелаете.

13. Замена слов только в том случае, если найдено отдельное совпадение

Иногда замена всех экземпляров данного слова или нескольких случайных слов — это не совсем то, что нам нужно. Возможно, нам нужно выполнить замену, если обнаружено отдельное совпадение.

Например, мы можем заменить start на stop только в том случае, если слово «службы» находится в той же строке. В этом случае произойдет следующее:

We need to start partying at work,
but let’s remember to start all services first.

В первой строке start не будет заменено на stop, поскольку в этой строке, в отличие от второй строки, нет слова «службы».

sed '/services/ s/start/stop/g' msg.txt

14. Выполнение двух или более замен одновременно

Вы можете объединить две или более замены в одной команде sed. Давайте заменим слова that и line в myfile.txt на This и verse соответственно.

Обратите внимание, как это можно сделать, используя обычную команду подстановки sed, за которой следует точка с запятой и вторая команда подстановки:

sed -i 's/that/this/gi;s/line/verse/gi' myfile.txt

Этот совет проиллюстрирован на следующем изображении:

15. Объединение Sed и других команд

Конечно, sed можно комбинировать с другими командами Linux для создания более мощных команд. Например, давайте воспользуемся примером, приведенным в СОВЕТ № 4, и извлечем наш IP-адрес из выходных данных команды ip Route.

Мы начнем с печати только той строки, где находится слово src. Затем мы преобразуем несколько пространств в одно. Наконец, мы вырежем поле 9th (считая один пробел разделителем полей), в котором находится IP-адрес:

ip route show | sed -n '/src/p' | sed -e 's/  */ /g' | cut -d' ' -f9

Изображение ниже иллюстрирует каждый шаг приведенной выше команды:

Краткое содержание

В этом руководстве мы поделились 15 советами и рекомендациями по sed, которые помогут вам в выполнении повседневных задач системного администрирования. Есть ли еще какой-нибудь совет, которым вы регулярно пользуетесь и которым хотели бы поделиться с нами и остальным сообществом?

Если да, сообщите нам об этом, используя форму комментариев ниже. Вопросы и комментарии также приветствуются – мы с нетерпением ждем вашего ответа!