Используя 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 были в пределах количества строк контекста, однако, этот вывод может быть не тем, что вы хотите.