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)

おすすめ記事