2013-09-16 3 views
0

Я имею эту функцию в моей Баш скриптBash скрипт для подсчета количества появлений струны в файле

if [ $numberOne -gt 10 ] 
     then 
       echo "$numberOne has occurred over 10 times" 
       echo "email me numberOne" 

     elif [ $numberTwo -gt 4 ] 
     then echo "$numberTwo has occurred over 4 times" 
       echo "email me numberTwo" 

     elif [ $numberThree -gt 4 ] 
     then echo "$numberThree has occurred over 4 times" 
       echo "email me numberThree" 

     elif [ $numberFour -gt 5 ] 
     then echo "$numberFour has occurred over 5 times" 
       echo "email me numberFour" 

     else echo "nothing found yet" 
       exit 


     fi 

} 

Информация: Я порт проверка. Я запускаю скрипт каждую минуту. Когда используется порт, я пишу его в файл, а затем читаю файл. Количество найденных совпадений равно количеству минут. 4 раза - 4 минуты, я хочу знать, активен ли порт больше, чем на несколько минут.

Что я хочу сделать:

3 цифры будут заполнять файл. В какой-то момент один из них будет присутствовать более 4 раз, а затем появится и остальные. В этот момент я хочу получить предупреждение, когда произойдет первое из них или [все из них после первого появления]. В идеале предупреждение будет таким: «NumberOne был открыт в течение 4 минут». И через 1 минуту это будет «5 минут» - пока я не остановлю его или не достигнут порог, я пока не знаю.

Проблема: Проблема здесь в том, что когда NumberOne встречается более 10 раз, а NumberTwo происходит 4 раза, после этого он только повторяет NumberTwo.

Я думал, что смогу использовать continue после каждого then, но я не могу!

Также: моя переменная NumberOne. NumberOne=$(grep -wc "port=51555" monitor.txt)

+3

Как вы думаете, что означает 'elif'? Я думаю, вам просто нужно 5 независимых предложений 'if'. Но действительно, что вы хотите, это массив чисел – Peter

ответ

2

Чтобы получить количество вхождений строки имеет на файл, используйте grep -c:

grep -c something file 

Пример приложение для этого:

file="/path/to/file" 
numberOne_string="something" 
numberOne=$(grep -c "$numberOne_string" "$file") 

И о вашей логике лучшего варианта I думаю, может быть только:

if [[ numberOne -gt 10 || numberTwo -gt 4 || numberThree -gt 4 || numberFour -gt 5 ]]; then 
    if [[ numberOne -gt 10 ]]; then 
     echo "$numberOne has occurred over 10 times" 
     echo "email me numberOne" 
    fi 
    if [[ numberTwo -gt 4 ]]; then 
     echo "$numberTwo has occurred over 4 times" 
     echo "email me numberTwo" 
    fi 
    if [[ numberThree -gt 4 ]]; then 
     echo "$numberThree has occurred over 4 times" 
     echo "email me numberThree" 
    fi 
    if [[ numberFour -gt 5 ]]; then 
     echo "$numberFour has occurred over 5 times" 
     echo "email me numberFour" 
    fi 
else 
    echo "nothing found yet" 
fi 

Или его отрицательная версия ,

Другой требует переменной:

nothing_found=true 
if [[ numberOne -gt 10 ]]; then 
    echo "$numberOne has occurred over 10 times" 
    echo "email me numberOne" 
    nothing_found=false 
fi 
if [[ numberTwo -gt 4 ]]; then 
    echo "$numberTwo has occurred over 4 times" 
    echo "email me numberTwo" 
    nothing_found=false 
fi 
if [[ numberThree -gt 4 ]]; then 
    echo "$numberThree has occurred over 4 times" 
    echo "email me numberThree" 
    nothing_found=false 
fi 
if [[ numberFour -gt 5 ]]; then 
    echo "$numberFour has occurred over 5 times" 
    echo "email me numberFour" 
    nothing_found=false 
fi 
if [[ $nothing_found == true ]]; then 
    echo "nothing found yet" 
fi 
+0

. Точнее сказать 'подсчитывать количество строк, содержащих строку'.Попробуйте это, например, «grep -c» A «<<<» A A «' Он печатает '1' – user000001

+1

' grep -o -c' должен сообщать о фактическом количестве вхождений, но не был в более ранних версиях GNU Coreutils. – tripleee

0

Вы проверяете различные переменные ... Вам не нужно elif там ... изменить его с независимыми if «с. Например:

if [ $numberOne -gt 10 ] 
then 
    echo "$numberOne has occurred over 10 times" 
    echo "email me numberOne" 
fi 

if [ $numberTwo -gt 4 ] 
then 
    echo "$numberTwo has occurred over 4 times" 
    echo "email me numberTwo" 
if 

if [ $numberThree -gt 4 ] 
then 
    echo "$numberThree has occurred over 4 times" 
    echo "email me numberThree" 
fi 

if [ $numberThree -gt 5 ] 
then 
    echo "$numberFour has occurred over 5 times" 
    echo "email me numberFour" 
fi 

if [ $numberOne -le 10 -a $numberTwo -le 4 -a $numberThree -le 4 -a $numberFour -le 5 ] 
then 
    echo "nothing found yet" 
    exit 
fi 
0

Вот рефакторинг, который уменьшает дублирование кода.

found=false 
while read variable count; do 
    value=${!$variable} 
    if [ "$value" -gt "$count" ]; then 
     echo "$value occurred more than $count times" 
     echo "email me $variable" 
     found=true 
    fi 
done <<____HERE 
    numberOne 10 
    numberTwo 4 
    numberThree 4 
    numberFour 5 
____HERE 

if ! $found; then 
    echo "Nothing found yet" 
fi 

Если у вас нет Bash, вы можете использовать вместо eval value="\$$variable".

Если вы хотите заполнить переменные «на лету», вы можете сделать grep -c внутри цикла, и, например, ввести. регулярное выражение или просто номер порта в первом столбце документа здесь.

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