Gibt es beim Paginieren der Ausgabe ein interaktives Filtertool?

Gibt es beim Paginieren der Ausgabe ein interaktives Filtertool?

Ich möchte die Ausgabe eines Programms übernehmen und interaktiv filtern, welche Zeilen an den nächsten Befehl weitergeleitet werden sollen.

ls | interactive-filter | xargs rm

Ich habe beispielsweise eine Liste von Dateien, die nicht mit einem Muster übereinstimmen, das ich reduzieren möchte. Ich hätte gerne einen Befehl interactive-filter, der die Ausgabe der Dateiliste seitenweise anzeigt, und ich könnte interaktiv angeben, welche Zeilen an den nächsten Befehl weitergeleitet werden sollen. In diesem Fall würde dann jede Zeile entfernt.

Antwort1

  1. iselectstellt eine Auf- und Ab-Liste bereit (als Eingabe aus einer vorherigen Pipe), in der der Benutzer mehrere Einträge markieren kann (als Ausgabe an die nächste Pipe):

    # 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 
    

    Ausgabe nach dem Drücken der Leertaste, um einige auf meinem System zu markieren:

    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. vipeermöglicht die interaktive Bearbeitung (mit dem bevorzugten Texteditor) dessen, was durch eine Pipe geht. Beispiel:

    # 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
    

    Ausgabe (nach dem Löschen einiger Zeilen in 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
    

Hinweis zu Push & Pull:

  • iselectbeginnt mit einer Liste, in derNichtsist ausgewählt.
  • vipebeginnt mit einer Liste, in derjedenDas angezeigte Element wird durch die Pipe gesendet, sofern der Benutzer es nicht löscht.

InDebian-basierten Distributionen können beide Dienstprogramme mit installiert werden apt-get install moreutils iselect.

Antwort2

Sie können vipein wenigen Zeilen Shell schreiben. Schneller und einfacher Proof-of-Concept, der für mich funktioniert:

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

Laden Sie dies in Ihre Shell hoch und schon ist es da. Der Zweck ifbesteht darin, die Generierung der Ausgabe zu unterdrücken, wenn der Editor (oder der Versuch, den Editor auszuführen) fehlschlägt.

verwandte Informationen