Я хотел бы взять выходные данные программы и интерактивно отфильтровать, какие строки передать следующей команде.
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
в несколько строк оболочки. Быстрое и грязное доказательство концепции, которое работает для меня:
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.$$
}
Source это в вашей оболочке и вот оно. Цель этого if
- подавить генерацию вывода, если редактор (или попытка запустить редактор) не срабатывает.