所以我正在编写一个脚本来从预先存在的脚本中获取输出的特定部分,并通过HTTP POST发送它们。
我需要使用以下格式发送它们:blade.$hostname.cpu=$cpuvalue
和blade.$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
但是当我运行脚本时,我得到了这个结果:
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不熟悉,无论我尝试什么,我都无法让它发挥作用。
答案 0 :(得分:0)
试试这个:
for n in {10..11}
do
name=`./getdata.v7 $1 $2 | grep -o LINX"$n"`
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
grep manual:
-o, - 仅匹配
Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.
答案 1 :(得分:0)
首先,我只会拨打./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"