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

Удаление столбцов из файла в определенных местах

 , , ,


1

1

Ранее я на этом форуме спрашивал как добавить значения в определенные строки, теперь нужно обратное действие. Старые маршруты, которые были до добавления новых нужно удалить. Они прописаны в самом конце маршрутов, я их выделил в примере.

option ms-classless-static-routes 32, 176,0,16,5, 10,30,20,1,  32, 2,2,2,2, 10,30,20,1,  32, 25,25,2,3, 10,30,20,1; 
option rfc3442-classless-static-routes 32, 176,0,16,5, 10,30,20,1,  32, 2,2,2,2, 10,30,20,1,  32, 25,25,2,3, 10,30,20,1;
И после удаления, нужно у ставшего последним столбца заменить символ с запятой на точку с запятой.
Чтоб уже получилось так:
option ms-classless-static-routes 32, 176,0,16,5, 10,30,20,1,  32, 2,2,2,2, 10,30,20,1;
option rfc3442-classless-static-routes 32, 176,0,16,5, 10,30,20,1,  32, 2,2,2,2, 10,30,20,1;
Я пытался использовать cut,
grep static-routes /etc/dhcp/dhcpd.conf |cut -d' ' -f1-17,21 > /etc/dhcp/dhcp.conf.new
но мне нужно сохранить все строки в файле и только в определенных удалить 3 столбца!
Подскажите, пожалуйста, как можно это сделать. Погуглив на английском и на русском языках, везде нахожу примеры где не нужно отбирать по значениям строки как у меня, а просто сразу удаляются по всему файлу столбцы.


sed -r '/option (ms|rf)/ s/(, *[0-9]{1,3}){9};/;/' file.txt

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

anonymous ()
Ответ на: комментарий от anonymous

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

amkgi ()
Ответ на: комментарий от amkgi

ну хз, должны удаляться ровно девять чисел до точки с запятой. может на примере покажешь?

anonymous ()
Ответ на: комментарий от anonymous

sed -r '/option (ms|rf)/ s/(, +[^ ]*){3};/;/' file.txt

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

shared-network net1 {
        subnet 172.21.4.64 netmask  255.255.255.248 {
        }
        subnet  10.146.68.0 netmask  255.255.255.0 {
                option routers  10.146.68.1 ;
                option subnet-mask 255.255.255.0;
                option ms-classless-static-routes 8, 10, 10,146,68,1, 32, 2,2,2,2, 10,146,68,1, 32, 3,3,3,3, 10,146,68,1, 32, 4,4,4,4, 10,146,68,1, 32, 5,5,5,5, 10,146,68,1, 32, x,x,x,x, 10,146,68,1;
                option rfc3442-classless-static-routes 8, 10, 10,146,68,1, 32, 2,2,2,2, 10,146,68,1, 32, 3,3,3,3, 10,146,68,1, 32, 4,4,4,4, 10,146,68,1, 32, 5,5,5,5, 10,146,68,1, 32, x,x,x,x, 10,146,68,1;
                pool {
                        range  10.146.68.2  10.146.68.120;
                }
        }
}
А есть сервера с более расширенными маршрутами (я об этом даже не подозревал пока, после того как скрипты везде отработались не начались проблемы, благо конфиги старые сохранил по скрипту) и там последние три столбца нужно оставить, но удалить 3 до него, то есть 4,5,6 я их выделил:
shared-network net22 {
        subnet 172.30.182.64 netmask  255.255.255.248 {
        }
        subnet  10.100.182.0 netmask  255.255.255.0 {
                option routers  10.100.182.1 ;
                option subnet-mask 255.255.255.0;
                option ms-classless-static-routes 8, 10, 10,100,182,1, 32, 2,2,2,2, 10,100,182,1, 32, 3,3,3,3, 10,100,182,1, 32, 4,4,4,4, 10,100,182,1, 32, 5,5,5,5, 10,100,182,1, 32, x,x,x,x, 10,100,182,1, 21, 77,77,77, 10,100,182,1;
                option rfc3442-classless-static-routes 8, 10, 10,100,182,1, 32, 2,2,2,2, 10,100,182,1, 32, 3,3,3,3, 10,100,182,1, 32, 4,4,4,4, 10,100,182,1, 32, 5,5,5,5, 10,100,182,1, 32, x,x,x,x, 10,100,182,1, 21, 77,77,77, 10,100,182,1;
                pool {
                        range  10.100.182.2  10.100.182.120;
                }
        }
}
Можно ли теперь sed'ом вырезать именно эту часть, а все остальное оставить? Буду очень признателен за помощь!)

amkgi ()
Ответ на: комментарий от anonymous

Все верно, удаляется ровно 9 символов. Просто в последнем столбце записан шлюз для маршрута и он разной везде длины (допустим где-то 10,133,222,1; а где-то 10.12,10,1; или 10,9,4,1;). Из-за этого где-то подрезались лишние символы в столбцах до последних трех, либо наоборот оставались символы с 3-го и 2-го столбца.

amkgi ()
Ответ на: комментарий от amkgi

вот так, вроде, работает:

sed -r '/option (ms|rf)/ s/((, +[^ ]*){3})((, +[^ ]*){3});/\3;/' file.txt

про то, почему индекс группы, которую нужно оставить, равен \3, где-то, вероятно, написано.

anonymous ()
Ответ на: комментарий от anonymous

О, это просто бомба, спасибо огромное! Поищу-ка я теперь книги по sed'у и awk, ранее находил только англоязычные варианты, может к сему моменту кто-нибудь набросал уже какие-нибудь переводы. Знание по ним все же нужно подтянуть.

amkgi ()
Ответ на: комментарий от amkgi

Был тут у нас один гуру sed'а с учебником собственного авторства, выложенного на своём сайте...
Имя не помню, надо старожилов поспрашивать

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

Если то о чем я думаю, то сайт давно мертв. А так да, годнота дальше некуда, лучшего не видел! Успел у себя сохранить до смерти сайта.

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

https://www.dropbox.com/sh/x6o3l863yqrhntm/AABWBu-N5YrxDCuWVV1o38Q6a?dl=0

Да, только по sed. И минус в том что без заглавной страницы (индексного файла) там было что-то типа «введение в sed», «перевод info», собственно увидите что ссылки в конце страниц ведут на мертвый сайт, так что или сами поправьте или пофайлово открывайте.
Часть документации и так в инете найти можно но самая годнота была только там.
Не исключаю вероятности что и это уже где-то опять выложено, но на тот момент когда сайт пропал (это давно было) я пытался найти и фиг там, нигде небыло. Даже не помню что побудило меня сохранить, но оказалось не зря.
Вообще весьма удивительно, что автор потратив немало времени создавая все это просто забил и забыл.

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

С awk вообще проще, это все-таки язык а не редактор, документации по нему полно.

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

перевёл в html и выложил на github: https://sed-docs.github.io/html/

Спасибо! Для многих пригодиться. Жаль вот что автор пропал :( Таких бы как он и побольше...
Автор если ты это когда-нибудь прочитаешь - поверь мне искренне хотелось задонатить но идея с тындыкс деньгами меня стреманула, т.к. не было уверенности что эти деньги реально дойдут до тебя.

индексный файл назывался «Краткий учебник по sed..mht»

Да, видимо со слепу и не заметил, архив давно лежит и как писал выше хз почему я его сохранил.

anc ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.