2014-01-09 37 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

相关问题