Использование 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
Это то, что вы пытаетесь сделать?
$ 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.