Понимание синтаксиса для печати нескольких строк после сопоставления с образцом - PullRequest
1 голос
/ 15 апреля 2019

Чтобы напечатать несколько (2) строк, следующих за шаблоном, используя awk:

Я нашел где-то следующее решение

$ awk '/Linux/{x=NR+2}(NR<=x){print}' file
Linux
Solaris
Aix

Я пытаюсь понять синтаксис

Обычно синтаксис awk

awk 'pattern{action}' file

Здесь мы находим

pattern = /Linux/
action = {x=NR+2}

тогда что такое (NR<=x){print}

Решение:

Мое понимание c-подобного синтаксиса для этого:

While read (file,line)
{
  if (line ~ '/pattern/') then
  {
    x= NR+2
  }
  if (NR <= x)
   {
     print
   {
}

для NR = 1, а если (строка ~ '/ pattern /'), то x устанавливается в NR + 2, например (1 + 2 = 3). Это значение не будет сброшено до завершения процесса. Поэтому, когда читается следующая строка и! (Строка ~ '/ pattern /'), тогда x по-прежнему равен 3, (NR (2) <= 3) имеет значение true, поэтому он печатает следующую строку Спасибо @Edmorton за непрекращающиеся </p>

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

FWIW Я бы не писал код, о котором вы спрашиваете, вместо этого я написал бы:

awk '/Linux/{c=3} c&&c--' file

См. Пример "g" в https://stackoverflow.com/a/17914105/1745001.

Сказав, чтоВаш оригинальный код в C-подобном синтаксисе будет выглядеть следующим образом:

NR=0
x=0
While read (file,line)
{
  NR++
  if (line ~ "Linux") {
    x = NR+2
  }
  if (NR <= x) {
    print
  }
}

Кстати, я знаю, что он часто используется неправильно, но не используйте слово «шаблон» в вашем программном обеспечении, так как оно очень неоднозначно - используйте строкуили regexp или условие (или в оболочке, но не в awk, sed, grep и т. д. и только в тех случаях, когда это уместно "шаблон глобализации"), в зависимости от того, что вы на самом деле имеете в виду.

Например, вы написали, что синтаксис awk:

awk 'pattern{action}' file

Нет.Или, может быть, в зависимости от того, что вы думаете, «шаблон» означает!Несмотря на то, что многие книги, учебные пособия и т. Д. Говорят о том, что для устранения любой двусмысленности, вы должны просто думать о синтаксисе awk как:

awk 'condition{action}' file

, где condition может быть любым из:

  1. ключевое слово типа BEGIN или END
  2. арифметическое выражение типа var < 7 или NF или 1
  3. сравнение регулярного выражения, например $0 ~ "foo" или $0 ~ /foo/ или /foo/ или $0 ~ var или match($0,/foo/)
  4. сравнение строк типа $0 == "foo" или index($0,"foo")
  5. вообще ничего, в этом случае предполагается, что оно будет true, когдаесть связанный блок действий.

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

0 голосов
/ 15 апреля 2019

ваш скрипт имеет два блока

$ awk '/Linux/ {x=NR+2}
       NR<=x   {print}' file

первый блок устанавливает переменную x, второй используется для печати строк. Обратите внимание, что вы можете сбросить {print}, так как это действие по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...