Сортировка Bash не сортируется правильно по времени

#bash #sorting #logging #scripting

#bash #сортировка #ведение журнала #сценарии

Вопрос:

Я пытаюсь отсортировать журнал, чтобы показать первые 3 уникальных IP-адреса для атаки на сервер. Я просматриваю журнал, чтобы найти неудачные попытки ввода пароля. Затем я сортирую этот результат по дате. Затем я передаю этот вывод в другую сортировку на основе 11-го столбца, чтобы получить только первое появление атаки для каждого уникального IP-адреса. Я передаю выходные данные в функцию head, чтобы получить первые 3 строки, а затем распечатать их с помощью awk. Команда, которую я использовал: grep 'Failed password' auth.log | sort -k1M -nk2 -nk3 | sort -k11,11 -u | head -3 | awk '{print $1" "$2" "$3" "$11}'

Правильные IP-адреса извлекаются из этого кода, но они не в порядке в зависимости от времени, как показано ниже: введите описание изображения здесь

Я попытался использовать -nk3.1,3.2 -nk3.4,3.5 -nk3.7,3.8 для time вместо -nk3, но я получаю тот же результат. Есть идеи, как исправить эту проблему?

Вот фрагмент файла журнала для вашей справки:

 Oct 11 10:12:24 myraptor sshd[29463]: Connection from 169.139.243.218 port 57273
Oct 11 10:12:25 myraptor sshd[29465]: Failed password for harvey from 169.139.243.218 port 57273 ssh2
Oct 11 10:12:25 myraptor sshd[29467]: Received disconnect from 169.139.243.218: Bye Bye
Oct 11 10:12:27 myraptor sshd[29469]: Connection from 169.139.243.218 port 57274
Oct 11 10:12:28 myraptor sshd[29471]: Failed password for harvey from 169.139.243.218 port 57274 ssh2
Oct 11 10:12:28 myraptor sshd[29473]: Failed password for harvey from 169.139.243.218 port 57274 ssh2
Oct 11 10:12:28 myraptor sshd[29475]: Received disconnect from 169.139.243.218: 11: Bye Bye
Oct 11 10:13:03 myraptor sshd[29477]: Connection from 56.13.188.38 port 55319
Oct 11 10:13:04 myraptor sshd[29479]: Failed password for harvey from 56.13.188.38 port 55319 ssh2
Oct 11 10:13:04 myraptor sshd[29481]: Received disconnect from 56.13.188.38: Bye Bye
Oct 11 10:13:15 myraptor sshd[29483]: Connection from 30.167.206.91 port 55320
Oct 11 10:13:16 myraptor sshd[29485]: Failed password for harvey from 30.167.206.91 port 55320 ssh2
Oct 11 10:13:16 myraptor sshd[29487]: Received disconnect from 30.167.206.91: Bye Bye
Oct 11 10:13:18 myraptor sshd[29489]: Connection from 30.167.206.91 port 55321
Oct 11 10:13:18 myraptor sshd[29491]: Failed password for harvey from 30.167.206.91 port 55321 ssh2
Oct 11 10:13:18 myraptor sshd[29493]: Received disconnect from 30.167.206.91: Bye Bye
  

Ожидаемый результат:

 Oct 11 10:12:25 169.139.243.218
Oct 11 10:13:04 56.13.188.38
Oct 11 10:13:16 30.167.206.91
  

Комментарии:

1. Пожалуйста, разместите проверяемую дату выборки в тексте, не публикуйте ее в комментариях, а отредактируйте свой первоначальный вопрос и соответствующий ожидаемый результат.

2. Можете ли вы поделиться фрагментом файла журнала в виде текста?

3. Я предоставил запрошенную информацию. Спасибо за вашу помощь!

Ответ №1:

Не могли бы вы попробовать следующее:

 grep 'Failed password' auth.log | sort -k1M -nk2 -nk3 | awk '!seen[$11]   {print $1, $2, $3, $11}' | head -n3
  

Вывод:

 Oct 11 10:12:25 169.139.243.218
Oct 11 10:13:04 56.13.188.38
Oct 11 10:13:16 30.167.206.91
  

awk Условие !seen[$11] делает уникальным внешний вид 11-го поля без изменения временного порядка.

Комментарии:

1. Спасибо за оперативную обратную связь! Приятно знать, что это работает.

Ответ №2:

В awk:

 $ awk '                    # all awk
$6=="Failed" {             # when Failed met
    if(!($11 in ips)) {    # and the ip has not been seen before
        ipc[  i]=$11       # increase stored ip counter
        ips[$11]           # and store ip for checking
        if(i==3)           # once we have 3 ips 
            exit           # we exit ie. execute END
    }
}
END {
    for(j=1;j<=i;j  )      # iterate index for ipc
        print ipc[j]       # and output
}' file
  

Вывод:

 169.139.243.218
56.13.188.38
30.167.206.91
  

Бесполезно grep , если вы все равно используете awk. И если вы используете GNU awk, в большинстве случаев вы тоже можете пропустить sort .

Ответ №3:

Вы можете использовать awk для подсчета IP-адреса построчно

  grep 'Failed password' auth.log | sort -k1M -nk2 -nk3 | sort -k11,11 | awk '!d[$11]  ' | head -3 | awk '{print $1" "$2" "$3" "$11}' 
  

Комментарии:

1. Я думал об этом, но меня беспокоит то, что если у меня нет правильного порядка, прежде чем я сделаю head -3, я могу получить неправильные IP-адреса.

2. Отредактировано. Теперь awk вместо -u используется для удаления дубликатов, которые не изменят порядок.