リモートsshコマンドで出力を取得するときにyumリストの出力を1行に保つにはどうすればよいですか?

リモートsshコマンドで出力を取得するときにyumリストの出力を1行に保つにはどうすればよいですか?

SSH経由でコンピュータに接続しssh machineて実行すると、インストールされているyum listすべての項目が期待どおりに出力されます。重要なことは、各項目が次のように1行にあることです。

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'サーバーのgrepにパイプしたりすると、yum list | grep xz -C 3出力行は次のように「切り捨てられて」短くなります。

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) に同梱されている見積もりをインストールし、以下を実行します。

# unbuffer yum repolist

答え3

今日(手術中)この問題で苦労し、yum check-update一つを探しています。「CLOSED NOTABUG」バグジラレポートそして様々な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/とは異なり、yumrepoqueryは出力から重複パッケージを削除しません)

関連情報