awk出力でキャリッジリターンを抑制/削除

awk出力でキャリッジリターンを抑制/削除

サーバーリストから稼働時間/負荷平均を返し、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このオプションは必要ありません。-tviscreen

ただし、実際にCR / LFで終わる行を処理する必要がある場合は、awk複数文字/正規表現レコード区切り文字(gawkやmawkなど)をサポートするawk実装で、レコード区切り文字をCR / LFに設定できます。例:

awk ... 'BEGIN{RS="\r\n"}{...}'

また、フィールドから失われたCRを削除したい場合は、次のものをawk使用できます。subまたは、次のものを使用できますgsub(どこでも機能します)。

gsub("\r","",$6)

答え2

\rsedを使用して末尾を削除できます。

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'

関連情報