Чтобы получить желаемый результат от заданного входа, попробуйте:
$ awk '/^$/{f=0} f{print} /3::/{f=1}' file
/etc/security/limits.conf
/etc/security/limits.d/test
Чтобы получить только одну строку вывода, выбранную с помощью переменной i
:
$ awk -v i=1 '/3::/{n=NR+i} n==NR' file
/etc/security/limits.conf
$ awk -v i=2 '/3::/{n=NR+i} n==NR' file
/etc/security/limits.d/test
awkПеременная i
, конечно, может быть установлена на значение переменной оболочки i
:
$ i=2
$ awk -v i="$i" '/3::/{n=NR+i} n==NR' file
/etc/security/limits.d/test
Раздел также может быть выбран из переменной:
$ i=2
$ k=3
$ awk -v i="$i" -v k="$k" -F:: '$1==k{n=NR+i} n==NR' file
/etc/security/limits.d/test
Как это работает:
-v i="$i" -v k="$k"
Эти опции устанавливают переменную awk i
и k
равными значениям переменных оболочки $i
и $k
соответственно.
-F::
Устанавливает разделитель полей на ::
.
$1==k {n=NR+i}
Если первое поле текущей строки равно переменной k
, тогда для переменной n
укажите номер текущей строки, NR
, плюс i
.
n==NR
Если текущий номер строки, NR
, равен n
, то выведите эту строку.