因此,我正在编写一个脚本,以从预先存在的脚本中获取特定的输出部分,并通过HTTP POST发送它们。
我需要以以下格式发送它们:blade.$hostname.cpu=$cpuvalueblade.$hostname.mem=$memvalue,其中$hostname, $cpuvalue and $memvalue是前面提到的脚本的输出。
我尝试了以下方法:

#!/bin/bash

for n in {10..11}
do
  name=`./getdata.v7 $1 $2 | grep LINX"$n" | cut -c1-6`
  cpu=`./getdata.v7 $1 $2 | grep LINX"$n"_processor-usage | cut -c24-25`
  mem=`./getdata.v7 $1 $2 | grep LINX"$n"_memory-usage | cut -c21-22`
  echo -e "blade.$name.cpu=$cpu\nblade.$name.mem=$mem"
done

但当我运行脚本时,得到的结果是:
刀片.linx10
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
linx10.cpu=2
刀片.linx10
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
LINX10型
linx10.mem=96
有谁能帮我改变一下,我只需要换一次linx10部件,而不是36次(是的,我数过了)?
我写的东西可能有一个非常愚蠢的错误,但我是个新手,不管我怎么努力,我都无法让它发挥作用。

最佳答案

首先,我只给./getdata.v7打一次电话:

data=$(./getdata.v7 "$1" "$2")

然后我会手动写出10 11,因为您真的不需要对两个单词进行大括号扩展:
for n in 10 11; do

然后,我只想要grep的第一个匹配,因为它似乎在多行上匹配LINX$n
name=$(fgrep "LINX$n" <<< "$data" | head -n 1 | cut -c1-6)
cpu=$(fgrep "LINX${n}_processor-usage" <<< "$data" | head -n 1 | cut -c24-25)
mem=$(fgrep "LINX${n}_memory-usage" <<< "$data" | head -n 1 | cut -c21-22)

注意,我使用的是fgrep而不是grep,因为匹配项不需要是正则表达式。整个管道可能可以用一个awk语句重写,但我们不需要去那里。
然后,我将使用printf而不是echo来提高可读性:
printf 'blade.%s.cpu=%s\n' "$name" "$cpu"
printf 'blade.%s.mem=%s\n' "$name" "$mem"

07-22 04:19