Как удалить перенос строк из команд DNF и YUM?

При использовании dnf и yum в дистрибутивах на основе rpm на основе Linux (RHEL / Red Hat, Fedora, CentOS и т. Д.) Утилита автоматически обматывает линии, чтобы сделать ее более удобной для чтения пользователем. Это проблематично, так как крайне затрудняет работу с данными посредством конвейерной обработки.

Например:

 $ dnf search jenkins-ssh-credentials-plugin-javadoc Last metadata expiration check: 6 days, 15:30:08 ago on Thu Sep 1 21:09:10 2016. ============= N/S Matched: jenkins-ssh-credentials-plugin-javadoc ============= jenkins-ssh-credentials-plugin-javadoc.noarch : Javadoc for jenkins-ssh-credentials-plugin $ dnf search jenkins-ssh-credentials-plugin-javadoc | grep ssh ====== N/S Matched: jenkins-ssh-credentials-plugin-javadoc ======= jenkins-ssh-credentials-plugin-javadoc.noarch : Javadoc for : jenkins-ssh-credentials-plugin 

Вы можете видеть, что как только вывод DNF передается через grep он решает обернуть данные совершенно по-другому, а затем, когда обычно отображается пользователю.

Об этом поведении было задано несколько вопросов ( # 584525 , # 986740 ), и постоянно проблемы закрываются как CLOSED NOTABUG потому что «Yum – это интерактивный текстовый интерфейс ui, который не подходит и не предназначен для трубопроводов». Решение в соответствии с разработчиками Red Hat – «использовать другой инструмент для работы».

Кажется нецелесообразным делать это, особенно когда предоставленные методы (например, установка repoquery ) даже не существуют в утилитах dnf и требуют установки еще дюжины пакетов, чтобы анализировать вывод этих данных.

В идеале пользователь сможет просто использовать данные в конвейерной обработке. Вместо этого было бы неплохо иметь простой однострочный вкладыш, который можно было бы использовать для удобства использования данных.

2 Solutions collect form web for “Как удалить перенос строк из команд DNF и YUM?”

yum и dnf записывать сообщения о проделанной работе, перебрасывая строку, используя возврат каретки. Эти сообщения не завернуты . grep не предназначен для этого, если строки не имеют встроенных управляющих символов. grep делает некоторые предположения о терминалах, но это совсем другая история .

Я использую сценарий sed для фильтрации перегруженных строк в «окончательную» строку (удаляя всю перегруженную часть). В примере script2log.sed ,

 # $Id: script2log.sed,v 1.3 2015/02/04 23:50:12 tom Exp $ # # Trim ordinary ANSI sequences, then OSC sequences, then backspace # sequences, then trailing CR's and finally overstruck sections of # lines. # # There are still several interesting cases which cannot be handled # with a script of this sort. For example: # CSI K (clear line) # cursor movement within the line s/␛[[][<=>?]\{0,1\}[;0-9]*[@-~]//g s/␛[]][^␛]*␇//g s/␛[]][^␛]*␛\\//g :loop s/[^␈]␈\(.\)/\1/g t loop s/␍␍*$//g s/^.*␍//g s/␛[^[]//g 

это делается с помощью этих двух команд, которая сначала удаляет любое количество возвращаемых возвратов каретки в строке, а затем удаляет любой раздел строки, включая возврат каретки. Остается только последняя копия строки, которую нужно написать (тот, который вы хотите):

 s/␍␍*$//g s/^.*␍//g 

(и да, это буквальные символы возврата каретки в скрипте).

Когда я беру вывод из yum (или dnf ), я не пытаюсь подключиться к grep (что гарантирует получение плохих результатов). Скорее, я использую script для захвата вывода и постпроцесса, использующего sed , например,

 script -c "yum upgrade" sed -f script2log.sed typescript >upgrade.log 

Существует отличный список «примерных» команд / заклинаний для sed , которые были куратором очень долгое время через имя sed1line.txt ( http://sed.sourceforge.net/sed1line.txt ). В этом файле есть отличный пример, который полезен в этом случае:

 # if a line begins with an equal sign, append it to the previous line # and replace the "=" with a single space sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D' 

В случае нашего вывода dnf / yum мы знаем, что завернутые строки начинаются с одного или нескольких экземпляров белого пространства, за которым следует двоеточие (:), за которым следует большее количество пробелов. Используя эти знания, мы можем изменить наш пример sed, чтобы учесть это и присоединиться к строкам:

 sed -r -e :a -e '$!N;s/\n[[:space:]]+://;ta' -e 'P;D' 

В этом случае мы должны принять решение, потому что + является частью расширенного набора регулярных выражений, нам нужно либо добавить -r чтобы использовать символ + , либо вернуться к использованию * в его месте (что будет соответствовать ноль или более экземпляров белого пространства). Любой из них будет работать, приведенный выше пример был предоставлен для педантичного исправления.

Результат следующий:

 $ dnf search jenkins-ssh-credentials-plugin-javadoc | sed -r -e :a -e '$!N;s/\n[[:space:]]+://;ta' -e 'P;D' | grep ssh ============= N/S Matched: jenkins-ssh-credentials-plugin-javadoc ============== jenkins-ssh-credentials-plugin-javadoc.noarch : Javadoc for jenkins-ssh-credentials-plugin 

Как вы можете видеть, теперь grep работает так, как ожидалось. Кроме того, это позволяет сделать больше творческого форматирования вывода для упрощения сканирования по списку пакетов:

 $ dnf search ssh | sed -r -e :a -e '$!N;s/\n[[:space:]]+://;ta' -e 'P;D' | sort | awk -F: '!($1~/^====/) {printf "%-40s : %s\n", $1, substr($0, index($0, $2))}' ansible.noarch : SSH-based configuration management, deployment, and task execution system apache-sshd-javadoc.noarch : API documentation for apache-sshd apache-sshd.noarch : Apache SSHD autossh.x86_64 : Utility to autorestart SSH tunnels bareftp.x86_64 : File transfer client supporting the FTP, FTP over SSL/TLS (FTPS) and SSH belier.noarch : Generates scripts allowing you to chain many ssh connections btrfs-sxbackup.noarch : Incremental btrfs snapshot backups with push/pull support via SSH ... trilead-ssh2.noarch : SSH-2 protocol implementation in pure Java WebShell.noarch : SSL server for web-based SSH access from browsers and mobile devices x11-ssh-askpass.x86_64 : A passphrase dialog for X and not only for OpenSSH 
  • Установка RPM Добавить репозиторий yum
  • Правило Удева было стерто после выполнения yum -y update
  • git 1.9 и yum groupinstall "Средства разработки"
  • ошибка переустановки httpd на CentOS 7, как я могу ее решить?
  • Как загрузить файл из репо и установить его позже без подключения к Интернету?
  • Я использую yum для установки vsftpd. Почему он не находится в `/ etc / rc.d / init.d /`?
  • Установка gcc на rhel 6.1
  • Разрешения и пользователь для загрузки yum
  • yum info: что означает «Репо: установлен»?
  • Эквивалент APTonCD для Fedora
  • yum Ошибка: rpmdb open failed
  • Interesting Posts

    Могу ли я сделать субдомен неразрешимым, несмотря на наличие «поиска» в resolv.conf?

    Linux общий FTP: нельзя удалять один файл

    $ HOME readonly: / usr / bin / xauth: тайм-аут в файле блокировки /home/fooftp/.Xauthority

    GNU parted resizeepart в скрипте

    Использование pkgsrc в домашнем каталоге в NetBSD

    Ошибка grub: «Файл не найден» для отдельного раздела / boot / efi

    Как я могу выбрать один из результатов поиска и разрешить его открытие с помощью указанного приложения

    Можно ли восстановить один раздел из образа диска Clonezilla?

    Сетевой интерфейс USB0 не встает

    Проход в меню конфигурации (меню)

    Настройка пользователя для доступа sftp в подкаталог другого домашнего каталога пользователей

    Дополнительная информация об ограничении загрузки в Squid Server

    syndaemon не будет отключать тачпад при наборе текста

    lshw и df видят другой размер раздела (5,5 ТБ против 200 Мбайт). Зачем?

    Почему соляризованная цветовая схема в vim выглядит иначе, чем в iTerm2?

    Linux и Unix - лучшая ОС в мире.