从 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 在上分配一个伪终端偏僻的机器,并且如果该终端设置了onlcr标志(这是默认设置),则每个 LF ( ) 都将在输出时\n转换为 CR/LF ( )。除非运行全屏和/或交互式程序(例如或 ) ,否则不需要\r\n该选项。-tviscreen

但是,如果您确实必须处理以 CR/LF 结尾的行awk,则可以在任何支持多字符/正则表达式记录分隔符的 awk 实现(如 gawk 或 mawk)中将记录分隔符设置为 CR/LF。例子:

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

另外,如果您想从 中的字段中删除杂散的 CR awk,您可以使用subor 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'

相关内容