2014-01-09 55 views
0

我一直在尋找一段時間,但找不到這個問題的答案。我想將特定命令的輸出與腳本中的數組匹配。我是一個perl編碼器,但我必須使用的系統類型的限制我不能使用Perl,我不得不求助於我的腳本bash。作爲供參考的是Debian 5.0.6。在bash中將命令的輸出匹配到數組

因此,只要我的sudo命令在特定的IP上運行,它就會給出我的數組中的某些單詞。我需要將數組中的任何單詞與輸出中的任何單詞匹配。

此外,這個數組有228個不同的事情,它需要通過。

我的電子郵件變量是當它發現一個併發揮作用時自己發送。

array=("City1" "City2" "City 3") 

sudo -u user /usr/local/bin/someprogram.pl x.x.x.x; 
MATCH1=`grep "$array"` 
if [ "{$MATCH1}" != ""] 
then 
    do $email 
else done 
fi 

我明白任何形式的與此幫助。我爲我的bash腳本無知道歉。

回答

0

如果我正確理解你的問題:你可以遍歷返回的每一行,並遍歷每個模式,如果有匹配,然後發送電子郵件。

sudo -u user /usr/local/bin/someprogram.pl x.x.x.x | while read line; do 
    for pattern in "${array[@]}"; do 
     if [[ $line =~ $pattern ]]; then 
      $email 
      break # exit after the first match, or comment out if you want to keep going 
     fi 
    done 
done 

UPDATE

如果你有很多的模式和很多線路,該腳本可能會很慢。也許你可以每行打印的「進度指示器」點,例如像這樣:

sudo -u user /usr/local/bin/someprogram.pl x.x.x.x | while read line; do 
    printf .  # prints a dot without linebreak 
    for pattern in "${array[@]}"; do 
     if [[ $line =~ $pattern ]]; then 
      echo # just to clear the line after the printf statements 
      $email 
      break # exit after the first match, or comment out if you want to keep going 
     fi 
    done 
done 
echo # clear the line after the printf statements 
+0

這很好,但它不會像過去那樣只返回一分鐘,然後返回我的提示。我沒有從它得到任何錯誤,但似乎很奇怪。非常感謝。 – Nvasion

+0

@Nvasion我使用某種「進度指示器」來更新我的帖子,使用某種「進度指示器」,如果有幫助的話。 – janos

+0

是的,它通過10行ips,然後通過數組中的228個項目,最終腳本需要10分鐘運行。我仍然有另一個工程師手動運行這些命令,我​​正在運行這個腳本一個星期,以確保它正在做它應該做的。但非常感謝。 – Nvasion

0

我覺得亞諾什的解決方案是更好,因爲它更具有可讀性和可維護性,但這裏是解決方案,它更類似於代碼模板你提供:

#!/bin/bash 

printWords() { 
    echo City 1 City x 
    echo City 2 
    echo City y 
    echo City 3 
} 

CMD_OUTPUT=$(printWords) 

array=("City 1" "City 3") 

MATCH=$(echo $CMD_OUTPUT | grep -E "${array[0]}${array[*]/#/|}") 

if [ -n "$MATCH" ] ; then 
    echo email 
fi 

${array[0]}${array[*]/#/$(echo \|)}結果在City 1|City 1 |City 3在這種情況下。第二個替換${array[*]/#/|}匹配每個數組元素的(空)開始,並將其替換爲管道符號|以構造OR正則表達式。然而,正則表達式會從管道符號開始,因此也會匹配任何空字符串,這就是爲什麼我需要預先寫入數組的第一個元素。還請注意使用[@][*]

+0

非常感謝幫助我,但Jano的解決方案可能會更好,因爲我正在嘗試使用它,但我會保留你給我的方便。 – Nvasion

相關問題