我有一个简单的命令来从服务器列表返回正常运行时间/平均负载,并使用 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
该选项。-t
vi
screen
但是,如果您确实必须处理以 CR/LF 结尾的行awk
,则可以在任何支持多字符/正则表达式记录分隔符的 awk 实现(如 gawk 或 mawk)中将记录分隔符设置为 CR/LF。例子:
awk ... 'BEGIN{RS="\r\n"}{...}'
另外,如果您想从 中的字段中删除杂散的 CR awk
,您可以使用sub
or 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'