Печатать содержимое между первыми совпадающими скобками

Моей первой мыслью было бы то, что если бы вы находились в среде, заботящейся о безопасности, вы могли бы захотеть ограничить количество входов в систему в разумных и понятных пределах, например, если вы знаете, что кто-то в среднем входит в систему только 3 раза в день, тогда день, когда они входят в систему 10 раз, является необычным и исключительным. Таким образом, это может указывать на подозрительную активность их входа в систему.

Я знаю, что есть много систем, которые люди создают в облачных средах, где использование API отслеживается и усредняется за периоды времени, и как только верхний предел использования API нарушается (за пределами их обычного использования ), они заблокирован для учетной записи / сильно ограничен, пока администратор не сможет убедиться, что ничего странного не происходит.

1
08.01.2021, 19:54
2 ответа

Сpcregrep:

start_word='START'
pcregrep -Mo "(?s)\Q$start_word\E\h*(\{(?:[^{}]++|(?1))*+\})" < your-file

Со встроенными zsh:

set -o rematchpcre
start_word='START'
[[ $(<your-file) =~ "(?s)\Q$start_word\E\h*(\{(?:[^{}]++|(?1))*+\})" ]] &&
  print -r -- $MATCH

Они используют функцию рекурсивного регулярного выражения PCRE, где (?1)выше вызывает регулярное выражение в первой паре (...).

Если у вас нет ни pcregrep, ни zsh, вы всегда можете прибегнуть к настоящей вещи (perl, Pв PCRE):

perl -l -0777 -sne '
    print $& if /\Q$start_word\E\h*(\{(?:[^{}]++|(?1))*+\})/s
  ' -- -start_word='START' < your-file

(обратите внимание, что все, кроме perl, предполагают, что $start_wordне содержит\E).

1
18.03.2021, 22:37

Простой метод грубой силы, который будет работать в любом awk в любой оболочке на всех компьютерах Unix:

$ cat tst.awk
s=index($0,"START") { $0=substr($0,s); f=1 }
f { rec = rec $0 RS }
END {
    len = length(rec)
    for (i=1; i<=len; i++) {
        char = substr(rec,i,1)
        if ( char == "{" ) {
            ++cnt
        }
        else if ( char == "}" ) {
            if ( --cnt == 0 ) {
                print substr(rec,1,i)
                exit
            }
        }
    }
}

$ awk -f tst.awk file
START{
    some text

    {
      more text}
almost there
}
2
18.03.2021, 22:37

Теги

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