Existe uma ferramenta de filtro interativa quando a saída de paginação?

5

Eu gostaria de pegar a saída de um programa e filtrar interativamente quais linhas serão canalizadas para o próximo comando.

ls | interactive-filter | xargs rm

Por exemplo, eu tenho uma lista de arquivos com os quais um padrão não pode ser comparado para reduzir. Eu gostaria de um comando interactive-filter que irá mostrar a saída da lista de arquivos e eu poderia indicar interativamente quais linhas encaminhar para o próximo comando. Nesse caso, cada linha seria removida.

    
por Ben Campbell 01.10.2016 / 19:16

2 respostas

8
  1. iselect fornece uma lista suspensa (como entrada de um canal anterior), em qual o usuário pode marcar várias entradas, (como saída para o próximo canal):

    # show some available executables ending in '*sh*' to run through 'whatis'
    find /bin /sbin /usr/bin -maxdepth 1 -type f -executable -name '*sh'   |
    iselect -t "select some executables to run 'whatis' on..." -a -m |
    xargs -d '\n' -r whatis 
    

    Saída depois de pressionar a barra de espaço para marcar alguns no meu sistema:

    dash (1)             - command interpreter (shell)
    ssh (1)              - OpenSSH SSH client (remote login program)
    mosh (1)             - mobile shell with roaming and intelligent local echo
    yash (1)             - a POSIX-compliant command line shell
    
  2. vipe permite a edição interativa (com o editor de texto favorito) do que passa por um canal. Exemplo:

    # take a list of executables with long names from '/bin', edit that
    # list as needed with 'mcedit', and run 'wc' on the output.
    find /bin -type f | grep '...............' | EDITOR=mcedit vipe | xargs wc
    

    Saída (após a exclusão de algumas linhas em mcedit ):

       378   2505  67608 /bin/ntfs-3g.secaudit
       334   2250 105136 /bin/lowntfs-3g
       67    952  27152 /bin/nc.traditional
       126    877  47544 /bin/systemd-machine-id-setup
       905   6584 247440 total
    

Nota sobre push & puxar:

  • iselect começa com uma lista na qual nada é selecionado.
  • vipe começa com uma lista na qual todos os itens mostrados serão enviados pelo canal, a menos que o usuário os exclua.

Em distros baseadas em Debian , ambos os utilitários podem ser instalados com apt-get install moreutils iselect .

    
por 01.10.2016 / 20:53
4

Você pode escrever vipe em algumas linhas de casca. Prova de conceito rápida e suja que funciona para mim:

EDITOR=vi   # change to preferred editor as needed.

vipe()
{
  cat > .temp.$$
  if $EDITOR .temp.$$ < /dev/tty > /dev/tty 2>&1 ; then
    cat .temp.$$
  fi
  rm .temp.$$
}

Coloque isso na sua concha e aí está. A finalidade do if é suprimir a geração da saída se o editor (ou tentar executar o editor) falhar.

    
por 06.10.2016 / 19:45