2014-01-09 3 views
0

Я искал какое-то время, но не смог найти ответ на этот вопрос. Я хотел бы совместить вывод конкретной команды с массивом, который находится в моем скрипте. Я perl-кодер, но ограничения типа системы, которую я должен использовать, я не могу использовать perl, и мне приходится прибегать к bash для моего скрипта. Это Debian 5.0.6 как FYI.Соответствие вывода команды массиву в 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

Большое спасибо за помощь в этом, но решение Яно может быть лучше для того, что я пытаюсь сделать с ним, но я сохраню то, что вы мне посоветовали. – Nvasion

Смежные вопросы