Удалить все строки до первой пустой строки включительно linux

Приложение B. Маленький учебник по Sed и Awk

В этом приложении содержится очень краткое описание приемов работы с утилитами обработки текста sed и awk. Здесь будут рассмотрены лишь несколько базовых команд, которых, в принципе, будет достаточно, чтобы научиться понимать простейшие конструкции sed и awk внутри сценариев на языке командной оболочки.

sed: неинтерактивный редактор текстовых файлов

awk: язык обработки шаблонов с C-подобным синтаксисом

При всех своих различиях, эти две утилиты обладают похожим синтаксисом, они обе умеют работать с регулярными выражениями, обе, по-умолчанию, читают данные с устройства stdin и обе выводят результат обработки на устройство stdout. Обе являются утилитами UNIX-систем, и прекрасно могут взаимодействовать между собой. Вывод от одной может быть перенаправлен, по конвейеру, на вход другой. Их комбинирование придает сценариям, на языке командной оболочки, мощь и гибкость языка Perl.

Одно важное отличие состоит в том, что в случае с sed, сценарий легко может передавать дополнительные аргументы этой утилите, в то время, как в случае с awk (см. Пример 33-3 и Пример 9-22), это более сложная задача .

B.1. Sed

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

Sed определяет, по заданному адресному пространству , над какими строками следует выполнить операции. [1] Адресное пространство строк задается либо их порядковыми номерами, либо шаблоном. Например, команда 3d заставит sed удалить третью строку, а команда /windows/d означает, что все строки, содержащие «windows» , должны быть удалены.

Из всего разнообразия операций, мы остановимся на трех, используемых наиболее часто. Это p — печать (на stdout), d — удаление и s — замена.

Таблица B-1. Основные операции sed

Операция Название Описание
[диапазон строк]/p print Печать [указанного диапазона строк]
[диапазон строк]/d delete Удалить [указанный диапазон строк]
s/pattern1/pattern2/ substitute Заменить первое встреченное соответствие шаблону pattern1, в строке, на pattern2
[диапазон строк]/s/pattern1/pattern2/ substitute Заменить первое встреченное соответствие шаблону pattern1, на pattern2, в указанном диапазоне строк
[диапазон строк]/y/pattern1/pattern2/ transform заменить любые символы из шаблона pattern1 на соответствующие символы из pattern2, в указанном диапазоне строк (эквивалент команды tr)
g global Операция выполняется над всеми найденными соответствиями внутри каждой из заданных строк

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

В отдельных случаях, операции sed необходимо заключать в кавычки.

В отдельных случаях, команды редактирования не работают в одиночных кавычках.

Sed использует ключ -e для того, чтобы определить, что следующая строка является инструкцией, или набором инструкций, редактирования. Если инструкция является единственной, то использование этого ключа не является обязательным.

Таблица B-2. Примеры операций в sed

Операция Описание
8d Удалить 8-ю строку.
/^$/d Удалить все пустые строки.
1,/^$/d Удалить все строки до первой пустой строки, включительно.
/Jones/p Вывести строки, содержащие «Jones» (с ключом -n ).
s/Windows/Linux/ В каждой строке, заменить первое встретившееся слово «Windows» на слово «Linux» .
s/BSOD/stability/g В каждой строке, заменить все встретившиеся слова «BSOD» на «stability» .
s/ *$// Удалить все пробелы в конце каждой строки.
s/00*/0/g Заменить все последовательности ведущих нулей одним символом «0».
/GUI/d Удалить все строки, содержащие «GUI» .
s/GUI//g Удалить все найденные «GUI» , оставляя остальную часть строки без изменений.

Замена строки пустой строкой, эквивалентна удалению части строки, совпадающей с шаблоном. Остальная часть строки остается без изменений. Например, s/GUI//, изменит следующую строку

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

Эта инструкция заменит начальные пробелы в строке на символ перевода строки. Ожидаемый результат — замена отступов в начале параграфа пустыми строками.

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

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

Быстрый способ установки двойных межстрочных интервалов в текстовых файлах — sed G filename.

Примеры использования sed в сценариях командной оболочки, вы найдете в:

Источник

Удалить все строки в файле, идущие после заданной

Нужно удалить все строчки, после заданной (по номеру строки или ее содержанию) sed ‘/содержание_строки/q’ — не работает. Как правильно сделать?

sed ‘/шаблон/,$d’ имя_файла

sed ‘номер_строки,$d’ имя_файла

sed ‘/done/,$d’ /etc/init.d/generator

c=$(( c + 1 )) echo «$c» >> /etc/init.d/generator

Строки, создаваемые после done, не удаляются. С номером строки тоже не вышло. Почему?

А права на запись в файл /etc/init.d/generator есть? От рута скрипт выполняешь?

А права на правку каталога /etc/init.d/ ?

Судя по тому, что строки создаются, предположу что с правами на запись все в порядке?

Непонятно, откуда должно взяться слово «done» в файле /etc/init.d/generator ?

И дополнительный вопрос: а почему все операции именно в /etc/init.d/ ? Не лучше ли сначала отладить скрипт в «песочнице» (где-нибудь в домашнем каталоге), а уж потом смело идти в общесистемный каталог?

А по содержанию таки sed’ом лучше.

Кстати по номерам строк можно было бы и так:

head -номер_последней_нужной_строки имя_файла

Я сейчас ещё раз проверил все предложенные мной варианты на нескольких файлах. Всё работает.

Скрипт постом выше это и есть generator, добавляющий сам в себя строки. Удалять он их тоже должен (все это не лишено смысла).

С grep -B999999 «done» /etc/init.d/generator тоже не работает.

А done у тебя именно так записан, как в комменте?

Надо done на отдельную строку вынести или точку с запятой поставить:

И всё-таки остаётся вопрос: зачем подобные эксперименты в общесистемном каталоге проводить? Да ещё не вполне уверенно чувствуя себя в шелле и его инструментах, как я понял.

head -17 /etc/init.d/generator так тоже не сработало. С правами все в порядке же? Цифры записываются в конец файла. chmod +w /etc/init.d/generator ls -l /etc/init.d/generator -rwxr-xr-x 1 root root 247 Янв 26 15:16 /etc/init.d/generator

done на отдельной строке, исковеркалось. На второй вопрос ответа нет — создавал где попалось. Разве могло повлиять?

А сообщения какие-нибудь выдаёт? Или молча ничего не делает?

М-да, неотлаженные скрипты напускать на системные каталоги — это более чем смело. Я бы так не решился.

Теоретически — нет. Но на практике всякое случается.

Я скрипт скопировал, но перед запуском стал внимательно смотреть, и нихрена не понял, что он должен делать. Задача абсолютно непонятна. Зачем весь этот гемор? Цель какая?

/* Вообще-то, прежде чем отвечать, я должен был сразу этот вопрос задать, а не ковырять не-пойми-что. 🙂 */

По-моему, это называется «серп → яйца».

Вот я и смотрю: то ли человек шелл только ещё осваивает, но сразу хватается за какие-то непонятные головоломки, то ли какой-то «вирус» пытается сварганить, и истинную цель скрывает. 🙂

Мне вот абсолютно непонятна практическая цель этих извратов с самокастрированием, да ещё и в динамике, да ещё и в системном каталоге.

Пытается изобрести форк патча Бармина: «патч Цеврио».

Меня спас ключ -i, цель была изменять файл. Выходит, по неопытности я не правильно сформулировал задачу.

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

нуждается в постоянно изменяемом файле, мониторя изменения в котором будет обращаться к своему конфигу.

Для этого есть нормальный инструмент — inotify. И никаких геморных костылей не нужно.

Вот не зря же постоянно твердят: правильная формулировка и постановка задачи даёт половину её решения. 🙂

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

Можно подробнее, как http://ru.wikipedia.org/wiki/Inotify сможет в этом помочь? На сколько я понял из вики, он занимается чем то более сложным, чем генерация файлов. Я правильно думаю, что он способен принудить ПО обращаться к конфигу?

Наоборот, inotify занимается совсем простым делом: отслеживает изменения файлов и/или каталогов и выдаёт соответствующее оповещение. А ты описываешь реакцию на это оповещение, скажем, тем же скриптом.

То есть, ты пишешь скрипт (или программу, без разницы), который запускается по сигналу от inotify и вносит нужные изменения в конфиг или ещё куда. Вот и вся механика.

Кстати, именно для скриптов есть утилитки inotifywait и inotifywatch (как пакет называется, навскидку не вспомню). Все проблемы отслеживания изменений файлов/каталогов решаются без труда.

Возможно у меня не самая стандартная ситуация — сам конфиг не меняется, но меняется значение IP в ddns хостах, прописанных в нем — необходимо чтобы ПО оборащалось к конфигу и таким образом обновляло в себе информацию об актуальных IP.

«То есть, ты пишешь скрипт (или программу, без разницы), который запускается по сигналу от inotify и вносит нужные изменения в конфиг или ещё куда. Вот и вся механика.»

Тогда возможен такой вариант — написание скрипта, берущего IP на интерфейсах ppp0 ppp1 ppp2 и т.д. и отправляющего их в нужный конфиг ПО, а inotify будет запускать этот скрипт, в случае если адреса поменяются?

Но с другой стороны очередной костыль, уже второй после скрипта. Я хотел обойтись только скриптом, просто заставить ПО каждые 5-10 секунд обращаться к своему конфигу. Можно было бы без интервалов, а с проверкой смены адреса на интерфейсе, но ddns хосты могут обновляться несколько минут — inotify сможет проверять в них значение IP?

Если ПО остлеживает изменение по дате последнего изменения файла, то man touch.

Источник

Читайте также:  Windows control panel from run
Оцените статью