Ваш вопрос не был мне понятен на 100%. Но если вы спрашиваете, как заменить inp на output, вы можете сделать это с помощью awk:
print "inp1" | awk 'sub(/inp/,"output")'
пожалуйста, попробуйте это,
Я сохранил данный образец вывода в файле /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
Единственная причина, по которой вы увидите тип данных, который вы показываете (более двух полей в строке в выводе команды ssh
), — это когда вы собираете вывод вашей 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
Здесь мы просто ставим перед каждой строкой имя хоста, считанное из текстового файла.