2014-03-12 62 views
1

所以我正在編寫一個腳本來從預先存在的腳本獲取輸出的特定部分並通過HTTP POST發送它們。For-loop + echo會改變我輸出所需的格式

我需要以以下格式發送它們: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 

但是當我運行該腳本,我得到這樣的結果:

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 LINX1 0 LINX10 LINX10 LINX10 LINX10 LINX10 LINX10 LINX10 LINX10 LINX10 LINX10 LINX10 LINX10.mem = 96

誰能幫助我什麼,我需要改變只獲取LINX10的一部分,而不是36次(是的,我數過它們)?

在我寫的內容中可能有一個非常愚蠢的錯誤,但我是bash的新手,無論我嘗試什麼,我都無法讓它工作。

+1

你可以展示的第一個腳本一些輸出的例子嗎? –

+0

'{10..11}'可能更容易寫成'10 11'。 – kojiro

回答

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" 
+0

嘿!感謝您的快速響應,我擴展大括號的原因是因爲一旦它完成,我將爲90個服務器運行該腳本,因爲我不想發佈內容,所以我在10到11之間使用了輸出3頁重複輸出。 ;) 是啊,我今天早上經過一些廣泛的測試發現,以前的腳本的輸出是每個服務器有18個參數的度量標準,並且由於grep將LINX100作爲LINX10的匹配項,它返回了36個匹配項:P 這樣做方式也使它更快,非常感謝! :) – Chris

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的手冊:

-o,--only匹配

Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line. 
+0

嘿!感謝您的快速響應,-o絕對有幫助,但我不能確定這是否能解決問題,因爲表達式LINX10出現在getdata.v7腳本輸出的36行不同的行上。感謝您的答案,但總是有用的學習命令的新參數:) – Chris