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

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

10.2.2.0/255.255.255.0является ссылкой -локальной, поэтому для нее не нужен шлюз. Эта запись не показывает, какой шлюз используется, но какой интерфейс используется для этой подсети.

2
04.01.2020, 20:31
4 ответа

Решение awk:

 awk '/^something P1 something$/{if(++i>1)exit} i' input_file

Это напечатает первую строку, соответствующую /^something P1 something$/, и все строки до следующей строки, соответствующей этому шаблону (, но не включающей указанную строку ), или до конца файла.

4
27.01.2020, 21:49

Я подозреваю, что вы действительно этого хотите.:

Для печати первого блока:

$ awk '$0=="something P1 something"{c++} c==1' file
something P1 something
content1
content2

или распечатать второй:

$ awk '$0=="something P1 something"{c++} c==2' file
something P1 something
content3
content4

и так далее. Однако без четкого изложения требований это всего лишь предположение.

3
27.01.2020, 21:49

авк

Общее решение для iго шаблона блока в awk:

awk -v i=1 -v pat='something P1 something'    '$0~pat{i--}i==0'

Пояснение:

-v i=1        # sets the pattern block to print (1 in this case).
-v pat='...'  # sets the regex pattern that will be tested.

$0~pat        # tests if the input line match the pattern
{i--}         # If the pattern was found, reduce the count.
i==0          # If the count has reduced to 0, print the block lines.

Если важен только шаблон P1, используйте:

awk -v i=1 -v pat='P1' '$0~pat{i--}i==0'

Для более быстрого выполнения выйдите после завершения блока:

awk -v i=1 -v pat='P1' '$0~pat{i--}i==0;i<0{exit}'

Если вы хотите, чтобы литерал соответствовал (, а не шаблону ), используйте:

awk -v i=1 -v pat='P1' '$0 == pat {i--}; i==0; i<0{exit}'

сед

Чтобы перейти от первого экземпляра одного шаблона к следующему экземпляру шаблона, вы можете выполнить в GNU sed:

sed -n '/something P1 something/!b;b2;:1;{/something P1 something/q;:2;p;n;b1}'

Перед первой строкой something P1 somethingможет быть несколько строк.
Сценарий останавливается (быстро ), когда найден второй шаблон.

Поскольку оба шаблона (start и end )равны, мы можем сократить команду до:

sed -n -e '/something P1 something/!b;b2;:1;{//q;:2;p;n;b1}'

А чтобы сделать его более портативным, используйте:

sed -n -e '/something P1 something/!{b' -e '};b2' -e ':1' -e '{//q;:2' -e 'p;n;b1' -e '}'
2
27.01.2020, 21:49
 $ sed -ne '
     /P1/!d
     :loop
        p;n
     //!bloop
     q
 ' file 

Результаты:

something P1 something1
content1
content2

Использование редактора Gnu sed с конструкцией Q, отличной от Posix:

$ sed -e '
   /P1/,/P1/!d
   //!{$q;b;}
   G;/\n./Q;s/\n.*//;h
' file

Это делается только с конструкциями Posix:

 $ sed -ne '
      /P1/,/P1/!d
      //!{
        p;$q;d
      }
      G;/\n./q;s/\n.*//p;h
 ' file

С Perl:

$ perl -lne '
    next unless $e = /P1/... /P1/;
    $e =~ /E/ ? last : print;
' file

Еще один:

$ perl -0777 -pe '$_ = /^(.*?P1(?s:.*?\n))(?=.*?P1)/m ? $1 : $,' file
2
27.01.2020, 21:49

Теги

Похожие вопросы