简而言之,我想将单行输出字符串拆分为多行,并用主机名标记每个原始字符串。
主机名 进程名 CPUCore
输出=$(ssh -q -o "StrictHostKeyChecking yes" $ssh_host 'ps -eo comm,lastcpu | grep rrcp')
如何通过返回输出插入循环,如下所示。
rrcpd 17 rrcpd 0
并重写为
Hostname1 rrcpd 17
Hostname1 rrcpd 0
笔记
数字可以是 0-32
主机名是一个变量字符串 $myhost
文本确实发生了变化,这意味着它不是严格的 rrcpd,它可能是例如
rrcpd 17 rrcpd 0
芝士 3 蛋糕 8
猫 9 狗 3
在每个主机上运行的命令
输出=$(ssh -q -o "StrictHostKeyChecking yes" $ssh_host 'ps -eo comm,lastcpu | grep rrcp')
当我删除 grep 时,输出可以通过 3-5 个进程返回,因此我希望能够拆分每个输出并将主机名添加到原始文件中以标记每个输出。我正在检查每个主机上正在运行哪些进程。
rrcpd 0 rrcp_mon.sh 24
RRCPD 0
RRCPD 0
rrcpd 0 rrcpd 1
rrcpd 0 rrcpd 0 rrcp_mon 24 rrcp_mon 24
RRCPD 0
RRCPD 0
rrcpd 17 rrcpd 0
ard 9 ssh 32 httpd 21 bax 22
我已经修改了下面提供的内容并设法让它工作
#!/bin/bash
for remote in $(cat ssh_hosts2.txt)
do
ssh -q -o StrictHostKeyChecking=yes "$remote" ps -eo comm,lastcpu |
sed "s/^/$remote /"
done
答案1
请尝试这个,
我已将给定的示例输出保存在文件 /tmp/test.txt 中。
xargs -n 2 | sed 's/^/Hostname1 /'
-n
表示每行的最大参数。
例如;
cat /tmp/test.txt | xargs -n 2 | sed 's/^/Hostname1 /g'
Hostname1 rrcpd 17
Hostname1 rrcpd 0
Hostname1 Cheese 3
Hostname1 cakes 8
Hostname1 Cats 9
Hostname1 dogs 3
答案2
您会看到显示的数据类型(命令输出中每行超过两个字段)的唯一原因是当您将+调用ssh
的输出收集到变量中,然后在不正确引用它的情况下输出它,如下所示in后面跟着代替.幸运的是,您根本不需要收集变量中的数据。ssh
ps
output=$(ssh ...)
echo $output
echo "$output"
while read remote; do
ssh -n -q -o StrictHostKeyChecking=yes "$remote" ps -eo comm,lastcpu |
awk -v host="$remote" '/rrcp/ { print host, $1, $2 }'
done <hosts.txt
在这里,awk
直接从命令读取,并且还完成最初在代码中ssh
完成的工作。grep
它假设它将获取包含两个字段的行,并使用给定的主机名(从 读取hosts.txt
)为每对字段添加前缀。
或者,
while read remote; do
ssh -n -q -o StrictHostKeyChecking=yes "$remote" ps -eo comm,lastcpu |
sed "s/^/$remote /"
done <hosts.txt
在这里,我们只需使用从文本文件中读取的主机名作为每行的前缀。