avpdnepr
@avpdnepr
Человек без любви опаснее тигра и акулы?

Как правильно написать скрипт на Bash?

Имеем входные данные
[Много данных]
Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr| - |user logged in| -
Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr| - |user changed password| -
Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr| - |user logged off| -
[Много данных]
Необходимо найти эти три строки. Первая строка - пользователь авторизован, вторая - пользователь поменял пароль, третья - пользователь вышел.
Я додумался только, чтоб отфильтровать их с помощью awk
awk '/user logged in|user changed password|user logged off/ {print}' script.log
А мне необходимо чтоб была проверка, что все три события с один и тем же пользователем dnepr, а также в одну и ту же секунду записаны в лог. Я не совсем понимаю как мне с помощью awk проверить несколько строк сразу и выдать результат - [dnepr] - bot is life
  • Вопрос задан
  • 415 просмотров
Пригласить эксперта
Ответы на вопрос 4
zoroda
@zoroda
Необычный Fullstack
Написать пример скрипта сейчас не успею. Но идея такая:
После обработки awk отсортируй результат, затем отдай его на вход следующей awk. Во втором скрипте awk сохраняй предыдущие значения даты, имени пользователя и действия. Их сравнивай с текущими. Так сможешь отловить записи с одинаковым временем, пользователем и полным набором действий.
Подробнее см. про секцию BEGIN в awk и использование переменных.
Ответ написан
Adamos
@Adamos
В регэкспах есть такая штука, как back reference. Позволяющая составить регулярку с подстановкой уже найденных значений, типа (\d\d:\d\d:\d\d)[^:]*\[([^]]+)\] - \[user logged in\][^:]+\1[^[]+\[\2\] - \[user changed password\].....
Ответ написан
Frankenstine
@Frankenstine
Сисадмин
Мне кажется, вам будет проще всего написать скрипт основанный на построчном чтении файла:
while read -r line
do
(тут вся логика)
done < "/path/to/filename"
где в логике вы будете с помощью переменных отслеживать наличие нужных данных в строчках.
Ответ написан
Комментировать
@abcd0x00
Через конечный автомат
text="\
abc1
abc2
Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr1| - |user logged in| -
Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr1| - |user changed password| -
Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr1| - |user logged off| -
def1
def2
Mon, 1 Aug 2012 00:15:00 +xxxx|1.1.1.1|dnepr2| - |user logged in| -
Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr2| - |user logged in| -
Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr2| - |user changed password| -
Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr2| - |user logged off| -
ghi1
ghi2
"

fsm()
{
    awk '{
        switch (state) {
        case 0:
            if (/user logged in/) {
                out = $0
                state = 1
            }
            break
        case 1:
            if (/user logged in/) {
                out = $0;
            } else if (/user changed password/) {
                out = out"\n"$0
                state = 2
            } else {
                out = ""
                state = 0
            }
            break
        case 2:
            if (/user logged off/) {
                out = out"\n"$0
                print out
                out = ""
                state = 0
            } else {
                out = ""
                state = 0
            }
            break
        }
    }'
}

echo "$text" | fsm


Вывод
[guest@localhost tmp]$ echo "$text" | fsm
Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr1| - |user logged in| -
Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr1| - |user changed password| -
Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr1| - |user logged off| -
Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr2| - |user logged in| -
Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr2| - |user changed password| -
Mon, 1 Aug 2012 00:15:00 +0200|1.1.1.1|dnepr2| - |user logged off| -
[guest@localhost tmp]$
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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