所以我正在编写一个脚本,以从预先存在的脚本中获取输出的特定部分,并通过 HTTP POST 发送它们。
我需要按以下格式发送它们:blade.$hostname.cpu=$cpuvalue
和 blade.$hostname.mem=$memvalue
with $hostname、$cpuvalue 和 $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
但是当我运行脚本时,我得到了这个结果:
blade.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
blade.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 次(是的,我数过了)?
我写的东西可能有一个非常愚蠢的错误,但我是 bash 的新手,无论我尝试什么,我都无法让它工作。
最佳答案
首先,我只会调用一次./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"
关于linux - For-loop + echo 改变了我输出的所需格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22356334/