¿Existe una herramienta de filtro interactiva al paginar la salida?

¿Existe una herramienta de filtro interactiva al paginar la salida?

Me gustaría tomar el resultado de un programa y filtrar de forma interactiva qué líneas canalizar al siguiente comando.

ls | interactive-filter | xargs rm

Por ejemplo, tengo una lista de archivos con los que un patrón no puede compararse para reducir. Me gustaría un comando interactive-filterque paginara el resultado de la lista de archivos y pudiera indicar interactivamente qué líneas reenviar al siguiente comando. En este caso, se eliminaría cada línea.

Respuesta1

  1. iselectproporciona una lista ascendente (como entrada de una tubería anterior), en la que el usuario puede etiquetar varias entradas (como salida a la siguiente tubería):

    # 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 
    

    Resultado después de presionar la barra espaciadora para etiquetar algunos en mi 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. vipepermite editar interactivamente (con el editor de texto favorito) lo que pasa por una tubería. Ejemplo:

    # 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
    

    Salida (después de eliminar algunas líneas mientras está en 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 empujar y tirar:

  • iselectcomienza con una lista en la quenadaestá seleccionado.
  • vipecomienza con una lista en la quecadaEl elemento mostrado se enviará a través de la tubería, a menos que el usuario lo elimine.

EnDebianDistribuciones basadas en .ambas utilidades se pueden instalar con apt-get install moreutils iselect.

Respuesta2

Puedes escribir vipeen unas pocas líneas de shell. Prueba de concepto rápida y sucia que funciona para mí:

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

Introduzca esto en su caparazón y ahí está. El propósito de ifes suprimir la generación de la salida si falla el editor (o el intento de ejecutarlo).

información relacionada