Bri*_*ard 5 yum fedora rhel dnf wrap
当在基于 rpm 的 Linux 发行版(RHEL/Red Hat、Fedora、CentOS 等)上使用时,dnf
该yum
实用程序将自动换行以使其更适合用户阅读。这是有问题的,因为它使得通过管道处理数据变得非常烦人。
例如:
$ 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
Run Code Online (Sandbox Code Playgroud)
您可以看到,一旦 DNF 的输出通过,grep
它就会决定以与通常向用户显示时完全不同的方式包装数据。
关于此行为已提交多个问题(#584525、#986740),并且这些问题始终被关闭,CLOSED NOTABUG
因为“Yum 是一个基于交互式文本的 ui,不适合也不适合管道。”。红帽开发人员的解决方案是“使用不同的工具来完成这项工作”。
必须这样做似乎是不合理的,特别是当提供的方法(repoquery
例如安装)甚至不存在于dnf
实用程序中并且需要安装更多的软件包才能解析此数据的输出时。
理想情况下,用户能够在管道中使用数据。取而代之的是,如果有一个简单的单行代码可以用来使数据可用,那就太好了。
有一个很棒的“示例”命令/咒语列表,这些命令/咒语已经通过名称(http://sed.sourceforge.net/sed1line.txtsed
)策划了很长时间。在这个文件中有一个很好的例子,在这种情况下很有帮助: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'
Run Code Online (Sandbox Code Playgroud)
dnf
在/输出的情况下,yum
我们知道换行将以一个或多个空格实例开始,后跟一个冒号 (:),然后是更多空格。利用这些知识,我们可以修改 sed 示例来解释这一点并加入以下行:
sed -r -e :a -e '$!N;s/\n[[:space:]]+://;ta' -e 'P;D'
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们需要做出决定,因为 是+
“扩展”正则表达式集的一部分,我们需要添加 来-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
Run Code Online (Sandbox Code Playgroud)
如您所见,现在可以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
Run Code Online (Sandbox Code Playgroud)