LINUX.ORG.RU
решено ФорумAdmin

Как удалить несколько строк из файла блоком

 , ,


0

1

Есть настроенная samba, несколько пользователей, у каждого своя директория и свои права на неё. Конфиг имеет вид:

...
[u001]
path = /media/u001
valid users = @u001
guest ok = no
browseable = no
writable = yes
read only = no
create mask = 0777
directory mask = 0777

[u002]
path = /media/u002
valid users = u002
guest ok = no
browseable = no
writable = yes
read only = no
create mask = 0777
directory mask = 0777

[u003]
path = /media/u003
valid users = @u003
guest ok = no
browseable = no
writable = yes
read only = no
create mask = 0777
directory mask = 0777
Задача: при удалении пользователя почистить конфиг samba командой. Пользователей много, строки идентичны.

Т.е. насколько я поняла, нужно сначала найти номер строки с именем пользователя, и после этого удалить строку с найденным номером и 8 строк дополнительно после найденного.

Нашла, что номер строки можно найти:

cat -n /etc/samba/smb.conf|grep u003
    69  [u003]
    70  path = /media/u003
    71  valid users = u003
Стереть строки можно командой (проверено, работает):

sed -i -e '69,77d' /etc/samba/smb.conf

Вопрос:

1. Как в выводе отобразить номер строки именно в заданном формате [u003], grep квадратные скобки игнорит;

2. Как полученный номер строки поместить в sed;

3. Или это делается как-то сильно проще, а я горожу огород?

Если бы не вопрос 2, было бы ничего, а так страшно советовать, вам, походу, нужно просто поучиться писать скрипты на bash и других ЯП, прочитать про регулярные выражения, а уже потом начинать править конфиги скриптами.

Если в лоб, то:

sed '/\[u002\]/,/^$/'d

Но, лучше скрипт на awk/perl, потому что потом окажется, что могут быть пробелы в начале строки, комментарии, блоки не разделяться пустыми строками и т.д.

mky ★★★★★
()
Ответ на: комментарий от teod0r

Спасибо за ответ!

Вывод работает!

 cat -n /etc/samba/smb.conf|grep '\[u003\]'
    66  [u003]

manik207
() автор топика
Ответ на: комментарий от mky

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

Указанная вами команда требует ввести название файла. Также, где в ней указывается что строк нужно 9, включая найденную?

manik207
() автор топика
python -c "import ConfigParser;p=ConfigParser.ConfigParser();p.read('/etc/samba/smb.conf');p.remove_section('user1');p.write(open('/etc/samba/smb.conf', 'w'));"
pawnhearts ★★★★★
()
Ответ на: комментарий от manik207

Спасибо, разобралась!

^$ - означает пустую строку;

\ - экранирование символов;

'одинарные кавычки' - значения аргументов команды;

/ - разделение значений аргументов внутри команды;

d - означает delete - удалить;

В конце через пробел надо написать название файла (конечно, это подразумевается, но можно было написать filename);

Чтобы sed не просто отобразил файл без строк, а именно удалил строки, нужно добавить ключ -i

В итоге, решение получилось простым и изящным, спасибо mky за наводку))

sed -i '/\[u002\]/,/^$/'d /etc/samba/smb.conf
manik207
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.