nixp.ru v3.0

23 января 2017,
понедельник,
11:37:03 MSK

DevOps с компанией «Флант»
Аватар пользователя fly4life
fly4life написал 28 сентября 2006 года в 09:48 (525 просмотров) Ведет себя как мужчина; открыл 182 темы в форуме, оставил 5340 комментариев на сайте.

Есть файл примерно следующего содержания:

fly4life@fly4life:~> cat test.txt
[ip]
#aol.com
ip= 205.188.142.182
filterdefault= drop
[ip]
#aol.com
ip= 64.12.50.151
filterdefault= drop
[ip]
#rambler.ru
ip= 81.19.70.3
filterdefault= drop
[ip]
#ranbler.ru
ip= 87.242.100.18
filterdefault= drop
[ip]
#sf.net
ip= 66.35.250.203
filterdefault= drop

Как вывести на экран содержимое этого файла без, например, секции:

[ip]
#ranbler.ru
ip= 87.242.100.18
filterdefault= drop

Вывести только эту секцию легко (с помощью того же grep):

fly4life@fly4life:~> grep -A2 -B1 ranbler.ru test.txt
[ip]
#ranbler.ru
ip= 87.242.100.18
filterdefault= drop
fly4life@fly4life:~>

А вот как бы ммм… проинвертировать чтоли этот вывод?

Master

Быстрое решение. Может не очень красивое.

Ненужную секцию кладем в 'remove.txt'

sdiff -ls test.txt remove.txt | sed -e 's/ *<$//'
fly4life
Master
Быстрое решение. Может не очень красивое.

Ненужную секцию кладем в 'remove.txt'

sdiff -ls test.txt remove.txt | sed -e 's/ *<$//'

sdiff удаляет самую первую строку [ip], оставляя при этом её в удаляемой секции =(. Т.е. в результате полчается:

#aol.com
ip= 205.188.142.182
filterdefault= drop
[ip]
#aol.com
ip= 64.12.50.151
filterdefault= drop
[ip]
[ip]
#ranbler.ru
ip= 87.242.100.18
filterdefault= drop
[ip]
#sf.net
ip= 66.35.250.203
filterdefault= drop
fly4life

Пока обошёл это, увеличив значение параметра '-B' у grep до 2 =) (у меня это сработало, поскольку в настоящем файле test.txt в самом его начале есть ещё одна секция [ip], которая никогда удаляться не будет и никакой пустой строки перед ней нет).

grep -A2 -B2 ranbler.ru test.txt | sdiff -ls test.txt - | sed -e 's/ *<$//'

Master, спасибо! =)

Genie

не bash, так perl…

$ perl -0pe 's~\[([^\[]*?\n)*?#ranbler.ru\s+(.+\n)*?\s+\n~~m' < test.txt
sas

Если разделитель записей ' \n' (пробел + \n):

awk 'BEGIN { RS="[ \t]\n" } !/ranbler\.ru/{ print $0 }' ttt

Если пустая строка:

awk 'BEGIN { RS="" } !/ranbler\.ru/{ print $0; print "" }' ttt
fly4life
Genie
не bash, так perl…

$ perl -0pe 's~\[([^\[]*?\n)*?#ranbler.ru\s+(.+\n)*?\s+\n~~m' < test.txt

Там, где нужно решать описываемую задачу, perl совсем не обязательно есть =(, в отличие от sed + awk.

fly4life
sas
Если разделитель записей ' \n' (пробел + \n):

awk 'BEGIN { RS="[ \t]\n" } !/ranbler\.ru/{ print $0 }' ttt

Если пустая строка:

awk 'BEGIN { RS="" } !/ranbler\.ru/{ print $0; print "" }' ttt

Вторая тоже то, что нужно. Только вот как-то странно оно удаляет ненужные строки, хотя работает…

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.