Usando o grep; Como mostro a enésima ocorrência de um padrão?

1

Usando grep ; Como mostro a ocorrência de um padrão em N th ?

Por exemplo; man sh |grep -A3 -- '-c' retornará várias correspondências.

Eu posso querer isolar apenas a ocorrência de 3 rd

--
    -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.
-- 

    
por tjt263 08.06.2016 / 05:03

1 resposta

2

A ocorrência que você deseja não é a ocorrência segundo ; é o terceiro . Para obter a terceira ocorrência de -c com três linhas de contexto:

$ 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.

Como funciona

o awk lê implicitamente sua linha de entrada por linha. Este script usa duas variáveis. n registra quantas vezes vimos -c . f rastreia quantas linhas devemos imprimir.

  • /-c/{n++; if (n==3)f=3;}

    Se chegarmos a uma linha contendo -c , aumente a contagem n em um. Se n for três, defina f para três.

  • f{print;f--;}

    Se f for diferente de zero, imprima a linha e diminua f .

Solução alternativa

$ 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.

A opção -m3 diz ao grep para retornar apenas as três primeiras correspondências. tail -n4 retorna as últimas quatro linhas entre essas correspondências. Se a segunda e a terceira correspondência para -c estiverem dentro do número de linhas de contexto, essa saída pode não ser o que você deseja.

    
por 08.06.2016 / 05:16