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
iselect
stellt 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
vipe
ermö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:
iselect
beginnt mit einer Liste, in derNichtsist ausgewählt.vipe
beginnt 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 vipe
in 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 if
besteht darin, die Generierung der Ausgabe zu unterdrücken, wenn der Editor (oder der Versuch, den Editor auszuführen) fehlschlägt.