@romankulish5

Как сделать условие в условии в bash?

Добрый день. Второй день копаюсь со скриптом, не могу понять, как сделать условие в условии.

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

Вот то что я сделал:
#!/bin/bash

read -p "Please enter filename: " filename;
count=`cat $filename | awk {'print $6'} | cut -c 21- | rev | cut -c 2- | rev | uniq | wc -l`
allusers=`cat $filename | awk {'print $6'} | cut -c 21- | rev | cut -c 2- | rev | uniq`
action=`cat $filename |  awk {'print $8,$9,$10'} | cut -c 2- | rev | cut -c 2- | rev`
#countact=`cat $filename | grep "$username" |awk {'print $6'} | cut -c 21- | rev | cut -c 2- | rev  | wc -l`
for ((i=1; i<="$count" ; i++));
do
        username=`cat $filename | awk {'print $6'} | cut -c 21- | rev | cut -c 2- | rev | uniq | sed -n "$i"p`
        firstop=`cat $filename| grep "$username" | awk '{print $5}' | head -n1 | cut -c 7-8`
        lastop=`cat $filename | grep "$username" | awk '{print $5}' | tail -1 | cut -c 7-8`
        countact=`cat $filename | grep "$username" |awk {'print $6'} | cut -c 21- | rev | cut -c 2- | rev  | wc -l`
#####ACTIONS
        action1=`cat $filename | grep "$username" |awk {'print $8,$9,$10'} | cut -c 2- | rev | cut -c 2- | rev | sed -n 1p`
        action2=`cat $filename | grep "$username" |awk {'print $8,$9,$10'} | cut -c 2- | rev | cut -c 2- | rev | sed -n 2p`
        action3=`cat $filename | grep "$username" |awk {'print $8,$9,$10'} | cut -c 2- | rev | cut -c 2- | rev | sed -n 3p`
        act1="user logged in"
        act2="user changed password"
        act3="user logged off"
        if [ $countact = 3 ]; then

                if [ $firstop = $lastop ]; then

                                if [ $action1 = $act1 ]; then

                                        if [ $action2 = $act2 ]; then

                                                if [ $action3 = $act3 ]; then

                                                 echo $username "- BOT"

                                                fi

                                        fi

                                fi
                fi
                else
                echo $username "- NOT BOT"
        fi
done


Вот кусок лога:
Mon, 22 Aug 2016 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |user logged in| -
Mon, 22 Aug 2016 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |user changed password| -
Mon, 22 Aug 2016 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |user logged off| -
Mon, 22 Aug 2016 13:15:42 +0200|178.57.66.225|faaaaaa11111| - |user logged in| -
Mon, 22 Aug 2016 13:15:40 +0200|178.57.66.215|terdsfsdfsdf| - |user logged in| -
Mon, 22 Aug 2016 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |user changed password| -
Mon, 22 Aug 2016 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |user logged off| -
Mon, 22 Aug 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |user logged in| -
Mon, 22 Aug 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |user logged in| -
Mon, 22 Aug 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |user changed password| -
Mon, 22 Aug 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |user logged off| -
Mon, 22 Aug 2016 13:17:50 +0200|178.57.66.205|abcbbabab| - |user logged in| -
Mon, 22 Aug 2016 13:17:50 +0200|178.57.66.205|abcbbabab| - |user changed password| -
Mon, 22 Aug 2016 13:17:50 +0200|178.57.66.205|abcbbabab| - |user changed profile| -
Mon, 22 Aug 2016 13:17:50 +0200|178.57.66.205|abcbbabab| - |user logged off| -
Mon, 22 Aug 2016 13:19:19 +0200|178.56.66.225|fxsciaqulmla| - |user logged in| -
Mon, 22 Aug 2016 13:19:19 +0200|178.56.66.225|fxsciaqulmla| - |user changed password| -
Mon, 22 Aug 2016 13:19:19 +0200|178.56.66.225|fxsciaqulmla| - |user logged off| -
Mon, 22 Aug 2016 13:20:42 +0200|178.57.67.225|faaaa0a11111| - |user logged in| -
  • Вопрос задан
  • 461 просмотр
Решения вопроса 2
roswell
@roswell
и швец, и жнец, и на дуде игрец
if [[ "$a" = 1 && "$b" = 2 && "$c" = 3 ]]; then
    # ...
fi
Ответ написан
yarkov
@yarkov
Помог ответ? Отметь решением.
Пригласить эксперта
Ответы на вопрос 1
saboteur_kiev
@saboteur_kiev Куратор тега bash
software engineer
квадратные скобки в bash это не синтаксис языка, это конкретная команда test
то есть
"[ $a==$b ]" тоже самое что "test $a==$b"

И когда вы пишете [ $a==$b && $c==$d ], баш парсит как "test $a==$b && $c==$d", то есть синтаксическая ошибка.
Закрывайте скобки, либо используйте опции команды тест

1) "if [ $a==$b ] && [ $c==$d ]; then"
2) "if [ $a==$b -a $c==$d ]; then"
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы