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