klink0v (klink0v) wrote,
klink0v
klink0v

Пара упражнений с sed

В копилку знаний, просто чтобы самому потом не забыть.

Случай 1. Некая сторонняя софтина что-то передаёт нам на стандартный ввод. При этом мы заранее не знаем сколько и чего там будет. Но доподлинно известно, что в конце блока полезной информации будет обязательно присутствовать пустая строка.

Решение: sed -n '/^$/Q'

Объяснение: sed перебирает входной поток в поисках пустой строки ("^$"). Как только находит, завершает свою работу (команда "Q"). Выхлоп sed-а можно перенаправить pipe-ом в ещё какую-нибудь утилиту, где потом парсить его и всячески дерибанить. Главное, что наш скрипт не "зависнет" на этой строчке, а будет выполняться дальше, даже если на входе мы так и не дождёмся EOF-а.

Случай 2. Нам нужно выдрать некоторую информацию из комментария в конфиге стороннего демона. Заранее известно, что это строка, состоящая из 140 печатных символов (base64). Местонахождение данного комментария внутри конфига может быть любым.

Решение: sed -ne 's/^.*# *\(.\{140\}\)/\1/p' "$FILE"

Объяснение. Ключ "e" говорит перейти в режим редактирования (edit), ключ "n" - не печатать найденные совпадения шаблона без явного на то указания. Ищем по регулярному выражению "начало строки, произвольное количество символов, знак #, произвольное количество пробелов, 140 каких-нибудь символов. Последний компонент шаблона заключен в экранированные скобки, что означает группировку с целью последующего упоминания (back reference). По факту совпадения шаблона в тексте заменяем всю найденную строку на её часть, соответствующую подмножеству в скобках ("\1") и распечатываем ("/p"). Получаем искомую последовательность.

Tags: bash, hints, linux, администрирование
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 4 comments