我有一个简单的命令可以从服务器列表中返回正常运行时间/平均负载,并使用 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
除非运行全屏和/或交互式程序,否则不需要该选项,例如vi
或screen
。
但是,如果您真的必须处理以 CR/LF in 终止的行awk
,您可以在任何支持多字符/正则表达式记录分隔符的 awk 实现中将记录分隔符设置为 CR/LF - 如 gawk 或 mawk。例子:
awk ... 'BEGIN{RS="\r\n"}{...}'
Run Code Online (Sandbox Code Playgroud)
此外,如果您想从 中的字段中删除一个杂散的 CR awk
,您可以使用sub
或gsub
(适用于任何地方):
gsub("\r","",$6)
Run Code Online (Sandbox Code Playgroud)