Используя grep; как мне показать N-е вхождение шаблона?
С помощью grep
; Как я могу показать N- й вхождение шаблона?
Например; man sh |grep -A3 -- '-c'
вернет несколько матчей.
Я мог бы хотеть выделить только 3- е вхождение, чтобы оно показывало:
--
-c Read commands from the command_string operand instead of from the standard input. Special parameter 0
will be set from the command_name operand and the positional parameters ($1, $2, etc.) set from the
remaining argument operands.
--
1 ответ
Вхождение, которое вы хотите, не является вторым вхождением; это третий. Чтобы получить третье вхождение -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
были в пределах количества строк контекста, однако, этот вывод может быть не тем, что вы хотите.