从 awk 输出中抑制/删除回车

tor*_*yan 7 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
Run Code Online (Sandbox Code Playgroud)

不幸的是,最后一个字段必须包含回车符,这意味着它不能出现在命令的末尾以外的任何地方。例如:

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
Run Code Online (Sandbox Code Playgroud)

如何从 a) 输入的末尾或 b) 字段 $6 的末尾删除回车符?

mos*_*svy 10

您应该删除-t选项 fromssh以防止首先生成回车。

-t选项指示 ssh 在远程机器上分配一个伪终端,如果该终端onlcr设置了标志(这是默认值),则每个 LF ( \n) 将\r\n在输出时转换为 CR/LF ( )。-t除非运行全屏和/或交互式程序,否则不需要该选项,例如viscreen

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

awk ... 'BEGIN{RS="\r\n"}{...}'
Run Code Online (Sandbox Code Playgroud)

此外,如果您想从 中的字段中删除一个杂散的 CR awk,您可以使用subgsub(适用于任何地方):

gsub("\r","",$6)
Run Code Online (Sandbox Code Playgroud)