Вхождение, которое вы хотите, не является вторым вхождением; это третий. Чтобы получить третье вхождение -c
с тремя строками контекста:
$ man sh | awk '/-c/{n++; if (n==3)f=3;} f{print;f--;}'
-c Read commands from the command_string operand instead of from the standard input. Special param‐
eter 0 will be set from the command_name operand and the positional parameters ($1, $2, etc.)
set from the remaining argument operands.
Как это устроено
awk неявно читает свои входные данные построчно. Этот скрипт использует две переменные. n
отслеживает, сколько раз мы видели -c
. f
отслеживает, сколько строк мы должны напечатать.
/-c/{n++; if (n==3)f=3;}
Если мы достигаем строки, содержащей -c
, то увеличиваем число n
на единицу. Если n
равно трем, тогда установите f
в три.
f{print;f--;}
Если f
ненулевое, выведите строку и уменьшите f
.
Альтернативное решение
$ man sh | grep -A3 -m3 -- -c | tail -n4
-c Read commands from the command_string operand instead of from the standard input. Special param‐
eter 0 will be set from the command_name operand and the positional parameters ($1, $2, etc.)
set from the remaining argument operands.
Опция -m3
сообщает grep, что нужно возвращать только первые три совпадения. tail -n4
возвращает последние четыре строки из этих совпадений. Однако, если второе и третье совпадения с -c
были в пределах количества строк контекста, этот вывод может быть не тем, что вы хотите.