Анализ журнала доступа HTTP, чтобы получить все запросы с ответом 429 в течение одной секунды

Использование PCRE -с включенными grepреализациями:

grep -Po '(^|[,])KEY1:\K[^,]*'

или egrepиcut:

grep -Eo '(^|[,])KEY2:[^,]*' | cut -d: -f2-

Для обоих методов значение не может содержать запятую.


Если у вас был правильный json, например.

{ "KEY1":"VALUE1", "KEY2":"VALUE2", "KEY3":"VALUE3" }

можно использоватьjq:

$ jq.KEY2
"VALUE2"
$ jq -r.KEY2
VALUE2
0
01.07.2021, 16:53
1 ответ

Это то, что вы пытаетесь сделать?

$ awk -F'[[ ]+' '$9==429{print $4, $1}' file | uniq -c | awk '$1>4{print $2 ":\n" $3}'
28/Jun/2021:06:37:02:
000.00.000.001
28/Jun/2021:06:37:03:
000.00.000.003

Если содержимое в первом наборе кавычек (, например."POST /abc/cba/ HTTP/1.1")не всегда представляет собой строки, разделенные тремя пробелами -, как в вашем образце ввода, тогда просто настройте его на это:

$ awk -F'[[ ]+' '{sub(/"[^"]*"/,"")} $6==429{print $4, $1}' file | uniq -c | awk '$1>4{print $2 ":\n" $3}'
28/Jun/2021:06:37:02:
000.00.000.001
28/Jun/2021:06:37:03:
000.00.000.003

Если по какой-то причине вы предпочитаете awk -единственное решение:

$ awk -F'[[ ]+' '$9==429{cnt[$4":\n"$1]++} END{for (key in cnt) if (cnt[key]>4) print key}' file
28/Jun/2021:06:37:02:
000.00.000.001
28/Jun/2021:06:37:03:
000.00.000.003

Все приведенные выше сценарии будут работать только с использованием обязательных инструментов POSIX в любой оболочке на каждом компьютере с Unix.

1
28.07.2021, 11:21

Теги

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