我想从程序中获取输出并交互式地过滤哪些行通过管道传输到下一个命令。
ls | interactive-filter | xargs rm
例如,我有一个模式无法匹配以减少的文件列表。我想要一个命令interactive-filter
来分页文件列表的输出,并且我可以交互式地指示将哪些行转发到下一个命令。在这种情况下,每一行都会被删除。
答案1
iselect
提供一个上下列表(作为来自前一个管道的输入),用户可以在其中标记多个条目(作为下一个管道的输出):# 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
按空格键在我的系统上标记一些后的输出:
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
允许交互式编辑(使用自己喜欢的文本编辑器)通过管道的内容。例子:# 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
输出(在 中删除一些行后
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
推拉注意事项:
iselect
从一个列表开始,其中没有什么被选中。vipe
从一个列表开始,其中每一个显示的项目将通过管道发送,除非用户删除它。
在德班基于发行版,两个实用程序都可以通过apt-get install moreutils iselect
.
答案2
vipe
写几行shell就可以了。对我有用的快速而简单的概念验证:
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.$$
}
将其放入您的 shell 中即可。其目的if
是在编辑器(或尝试运行编辑器)失败时抑制输出的生成。