Всегда можно попробовать старый добрыйgrep
:
grep -wFn 1.1.1.2 yourIPfile
или
ip=1.1.1.2 ; grep -wFn $ip yourIPfile
В обоих случаях вывод
1:node2,1.1.1.2
Вы были очень близки:
sed '/DESCRIPTION/p;//,/^[^ ]/!d;//d' filename
Будет делать то, что вы хотите. Почему?
/start/,/stop/!d
//d
будет делать так (пустой шаблон //
соответствует последнему шаблону, таким образом, строка /stop/
)p
напечатаем его раньше, и вы снова получите команду, которую я показывал (, используя пустой шаблон)Обновление с различными подходами
В своем комментарии вы назвали это «обходным путем», что с некоторой точки зрения так и есть. И вообще, для себя я выбрал бы другое,более sed
подход:
sed '/^ /{H;d;};x;/^DESCRIPTION/!d' filename
Это должно казаться естественным для sed
влюбленных, но для некоторых может показаться странным на первый взгляд. Отсюда следует подход «желание -я -мог -помнить «-. Что это такое? Каждый раз, когда вы подходите к строке без отступа, вы думаете: «Хотел бы я помнить строки раньше, стоит ли их печатать». Затем мы просто предполагаем, что они есть в нашей памяти, в области хранения, поэтому мы можем просто x
изменить пространство шаблонов и пространство хранения и d
удалить их, если они не начинаются с DESCRIPTION
(, если они начинаются с, он будет напечатан по умолчанию ).
Преимущество x
заключается в том, что каждая строка без отступа автоматически помещается в пространство для хранения, поэтому нам просто нужно добавить строки с отступом в пространство для хранения с помощью H
. Часть /^ /{H;d;}
делает (часть d
, чтобы избежать вывода или дальнейшей обработки этих строк ).
Программист поступил бы наоборот. Они, вероятно, сделали бы вот такую петлю:
sed '/DESCRIPTION/!d
:loop
N;/\n[^ ].*/!bloop
s///' filename
То есть отбрасываем все до тех пор, пока не встретим ключевое слово DESCRIPTION
, затем запускаем цикл для сбора строк с N
и зацикливаем до тех пор, пока не появится строка с не -пробелом \n[^ ].*
. В этом случае удалите последнюю строку (еще раз, воспользовавшись пустым шаблоном ).
Это тоже работает, но это не типичный способ работы в sed
.
Да, sed поддерживает такие диапазоны адресов:
sed -n '/string1/,/string2/p file
В вашем случае попробуйте использовать опцию -E
для расширенных регулярных выражений.
sed -nE '/this/,/^[^ ]/p' filename