当我通过 SSH 连接到一台机器ssh machine
并运行它时yum list
,它会输出按预期安装的所有内容,重要的是每个项目都在一行上,如下所示:
xz-devel.i386 4.999.9-0.3.beta.20091007git.el5 base
xz-devel.x86_64 4.999.9-0.3.beta.20091007git.el5 base
xz-libs.i386 4.999.9-0.3.beta.20091007git.el5 base
xz-lzma-compat.x86_64 4.999.9-0.3.beta.20091007git.el5 base
但是,在远程执行此操作时ssh machine 'yum list'
,甚至在服务器上将其通过yum list | grep xz -C 3
管道传输到 grep 时,输出行会被“截断”并变得更短,如下所示:
xz-devel.i386 4.999.9-0.3.beta.20091007git.el5
base
xz-devel.x86_64 4.999.9-0.3.beta.20091007git.el5
base
xz-libs.i386 4.999.9-0.3.beta.20091007git.el5
base
xz-lzma-compat.x86_64 4.999.9-0.3.beta.20091007git.el5
base
怎样才能让线条的尺寸不这样缩小呢?我的最终愿望是将其通过管道传输tee
,然后通过 ansible 对所有主机的输出文件进行一些处理。
似乎这是由于某种“虚拟终端”作为 SSH/管道的一部分而发生的,因为如果我缩小运行时断线的终端大小,我可以得到相同的行为yum list
。因此我假设管道的添加以某种方式告诉yum list
终端的宽度只有 X 列
答案1
每这个答案@thrig 在评论中提供,我能够通过执行以下操作使其正确输出
yum list installed | xargs -n3 | column -t
答案2
安装 unbuffer(1) 附带的expect,然后运行:
# unbuffer yum repolist
答案3
我今天(在手术期间)与此斗争yum check-update
,并在找到一个“CLOSED NOTABUG”bugzilla 报告和各种Python 技巧,我想出了另一个解决方法:
script -q -c "stty cols 150; yum check-update" /dev/null > /path/to/output.txt 2>&1
或者:
script -q -c "stty cols 150; yum check-update" /path/to/output.txt > /dev/null
150 是一个任意大的数字,足以防止包装;如果需要,向上调整。-q
如果您使用非空输出文件名,该选项将禁止初始“脚本于 $(date) 开始”行。
对于原来的问题,该行将是:
script -q -c "stty cols 150; yum list" /dev/null
答案4
您可以使用该repoquery
命令生成可解析的输出。例如:
repoquery '*' --queryformat='%{name} %{evr} %{from_repo}' | column -t
给出:
0ad 0.0.23b-13.fc32 fedora
0ad 0.0.23b-17.fc32 updates
0ad-data 0.0.23b-4.fc32 fedora
0xFFFF 0.8-3.fc32 fedora
2048-cli 0.9.1-9.fc32 fedora
2048-cli-nocurses 0.9.1-9.fc32 fedora
2048-cli-sdl 0.9.1-9.fc32 fedora
2ping 4.3-6.fc32 fedora
2ping 4.5-1.fc32 updates
389-ds-base 1.4.3.18-1.fc32 updates
... 等等。
(与dnf
/不同yum
,repoquery 不会消除其输出中的重复包)