サーバーリストから稼働時間/負荷平均を返し、awkを使用して出力形式を指定する簡単なコマンドがあります。
for i in $(cat servers); do ssh $i -qt "uptime" | awk -F\, -v host=\"$i\" '{ print host, $4, $5, $6 }'; done
これはかなりうまく機能します。
"server1" load average: 0.22 0.37 1.99
"server2" load average: 0.22 0.37 1.99
"server3" load average: 5.96 4.39 5.66
残念ながら、最後のフィールドにはキャリッジリターンを含める必要があります。つまり、コマンドの終わり以外はどこにも現れません。たとえば、
for i in $(cat servers); do ssh $i -qt "uptime" | awk -F\, -v host=\"$i\" '{ print host, $6, $5, $4 }'; done
出力:
0.64 load average: 0.17" 1.74
0.64 load average: 0.17" 1.74
0.78 load average: 0.15" 3.24
a) 入力端または b) $6 フィールドの末尾からキャリッジリターンを削除するにはどうすればよいですか?
答え1
最初からキャリッジリターンが生成されないようにするには、この-t
オプションを削除する必要があります。ssh
この-t
オプションは ssh に疑似端末を割り当てるよう指示します。離れてその端末にフラグが設定されている場合(デフォルト)、各LF()はonlcr
出力時\n
にCR / LF()に変換されます。フルスクリーンおよび/またはインタラクティブプログラム(または)を実行しない限り、\r\n
このオプションは必要ありません。-t
vi
screen
ただし、実際にCR / LFで終わる行を処理する必要がある場合は、awk
複数文字/正規表現レコード区切り文字(gawkやmawkなど)をサポートするawk実装で、レコード区切り文字をCR / LFに設定できます。例:
awk ... 'BEGIN{RS="\r\n"}{...}'
また、フィールドから失われたCRを削除したい場合は、次のものをawk
使用できます。sub
または、次のものを使用できますgsub
(どこでも機能します)。
gsub("\r","",$6)
答え2
\r
sedを使用して末尾を削除できます。
ssh $i -qt "uptime" | sed 's/\r$//' | awk ...
# ....................^^^^^^^^^^^^^
また、ベストプラクティスのためにファイルから行を読まないでくださいfor
答え3
「sed」を使うように答えた。
代わりに「tr」を使用することを提案しました。
$ awk '{print $1}' < /proc/loadavg | tr '\n' ' '
または
$ awk '{print $1}' < /proc/loadavg | tr -d '\n'