Есть ли интерактивный инструмент фильтрации при постраничном выводе?

Есть ли интерактивный инструмент фильтрации при постраничном выводе?

Я хотел бы взять выходные данные программы и интерактивно отфильтровать, какие строки передать следующей команде.

ls | interactive-filter | xargs rm

Например, у меня есть список файлов, с которыми шаблон не может сопоставиться для сокращения. Мне нужна команда, interactive-filterкоторая будет разбивать вывод списка файлов на страницы, и я мог бы интерактивно указывать, какие строки пересылать следующей команде. В этом случае каждая строка затем будет удалена.

решение1

  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
    
  2. 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- подавить генерацию вывода, если редактор (или попытка запустить редактор) не срабатывает.

Связанный контент