1

Используя 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 ответ1

2

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .