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, которые помогут вам в выполнении повседневных задач системного администрирования. Есть ли еще какой-нибудь совет, которым вы регулярно пользуетесь и которым хотели бы поделиться с нами и остальным сообществом?
Если да, сообщите нам об этом, используя форму комментариев ниже. Вопросы и комментарии также приветствуются – мы с нетерпением ждем вашего ответа!