Tubulação para três comandos [duplicados]

0

No manual de sudo , preciso pesquisar por -k , então tentei fazer isso:

man sudo | grep '\-k'

Mas isso resultaria em um parágrafo escrito parcialmente na saída:

sudo -h | -K | -k | -V
             Similar to the -k option, except that it removes the user's
 -k, --reset-timestamp

Em vez disso, tentei imprimir o manual inteiro e colorir a frase de pesquisa com:

man sudo | grep '\-k\|$'

Mas como a página de manual é muito longa, não consigo rolar o suficiente para alcançar o início da saída (Nota: não quero alterar as linhas de Scrollback nas configurações de perfil do Terminal).

Então eu preciso usar os comandos more ou less , para poder revelar a saída por página, então eu tentei:

man sudo | grep '\-k\|$' | less

Mas é claro que não funciona, porque o pipe executa o segundo comando no primeiro comando.

Alguma ideia de como redirecionar o tubo?

Ou faça grep imprimir todo o parágrafo em vez de uma linha? (as linhas são baseadas no tamanho da janela do Terminal)

    
por Shayan 08.02.2018 / 15:05

3 respostas

3

man por padrão já usa less como um pager para exibir o conteúdo da página de manual.

Agora, less tem um recurso de pesquisa e destaque integrado, portanto, você não precisa de uma ferramenta externa como grep para isso.

Simplesmente abra a página manpage executando man sudo em um shell, então digite /-k (pressione / e digite seu padrão de busca). Agora, less será destacado sempre que essa expressão regular corresponder ao documento e também pular diretamente para a primeira ocorrência.

Você pode navegar para a próxima partida digitando n (pressione N ) ou a correspondência anterior digitando N (pressione Shift + N ).

Mais geral, se você quiser exibir a saída de grep com realce colorido em less , você deve usar grep --color=always (para sempre emitir códigos de cores, mesmo quando não estiver enviando para um terminal, mas um pipe) e less -R (para interpretar a cor escapa em vez de imprimir os caracteres de controle):

man sudo | grep --color=always '\-k\|$' | less -R
    
por Byte Commander 08.02.2018 / 15:23
3

Use grep -A , -B e -C para capturar as linhas adjacentes

man grep | grep '\-[ABC]' -A2

   -A NUM, --after-context=NUM
          Print NUM lines of trailing context after matching lines.  Places a line containing a group separator (described under --group-separator) between contiguous groups of matches.  With the -o or
          --only-matching option, this has no effect and a warning is given.

   -B NUM, --before-context=NUM
          Print NUM lines of leading context before matching lines.  Places a line containing a group separator (described under --group-separator) between contiguous groups of matches.  With the -o or
          --only-matching option, this has no effect and a warning is given.

   -C NUM, -NUM, --context=NUM
          Print  NUM  lines  of  output  context.   Places  a line containing a group separator (described under --group-separator) between contiguous groups of matches.  With the -o or --only-matching
          option, this has no effect and a warning is given.

No seu caso:

man sudo | grep '\-k' -A5 -B2

Isso obviamente não é perfeito, já que você não sabe quantas linhas são necessárias, mas ainda pode ajudá-lo a encontrar o que precisa.

    
por RoVo 08.02.2018 / 15:25
1

Talvez o pager most satisfaça seus requisitos. Experimente

export PAGER=most
man sudo
/-k
    
por S.M. 08.02.2018 / 15:14