Přeskočit obsah

Kombinátorové výrazy¤

Přehled¤

Kombinátory jsou funkce pro skládání parsec výrazů (parserů nebo jiných kombinátorů) dohromady. Specifikují, jak se provádí analýza, jaký je typ výstupu. Mohou být použity pro řízení toku analýzy (aplikaci podmínkových nebo opakovaných výrazů) a také pro hledání předběžného výrazu ve vstupním řetězci.

Výběr výstupu určuje typ výstupu:

Výrazy pro řízení toku mohou provádět sekvenci parserových výrazů na základě určitých podmínek:

  • !PARSE.REPEAT: Provádí stejnou sekvenci výrazů vícekrát, podobně jako příkaz "for" z různých jazyků.
  • !PARSE.SEPARATED
  • !PARSE.OPTIONAL: Přidává volitelnou parserovou funkci, podobně jako příkaz "if/else" z různých jazyků.
  • !PARSE.TRIE: Provádí sekvenci výrazů na základě předpony vstupního řetězce.

Předběžné výrazy:


!PARSE.KVLIST¤

Analyzuje seznam párů klíč-hodnota.

Iterováním přes seznam prvků výraz !PARSE.KVLIST shromažďuje páry klíč-hodnota do tašky.

Typ: Kombinátor

Synopse:

!PARSE.KVLIST
- <...>
- key: <...>

Prvky, které nejsou klíčem, jsou analyzovány, ale nejsou shromažďovány:

!PARSE.KVLIST
- <...>  # analyzováno, ale ne shromážděno
- key1: <...>  # analyzováno a shromážděno
- key2: <...>  # analyzováno a shromážděno

Vnořené výrazy !PARSE.KVLIST jsou spojeny s nadřazeným:

!PARSE.KVLIST
- <...>
- !PARSE.KVLIST  # výraz je spojen s nadřazeným
  - key3: <...>
  - <...>
- key4: <...>

Example

Vstupní řetězec:

<141>May  9 10:00:00 myhost.com notice tmm1[22731]: User 'user' was logged in.
!PARSE.KVLIST
- '<'
- PRI: !PARSE.DIGITS
- '>'
- TIMESTAMP: !PARSE.DATETIME
                - month: !PARSE.MONTH 'short'
                - !PARSE.SPACES
                - day: !PARSE.DIGITS # Den
                - !PARSE.SPACES
                - hour: !PARSE.DIGITS # Hodiny
                - ':'
                - minute: !PARSE.DIGITS # Minuty
                - ':'
                - second: !PARSE.DIGITS # Sekundy

- !PARSE.SPACES
- HOSTNAME: !PARSE.UNTIL ' '
- LEVEL: !PARSE.UNTIL ' '
- PROCESS.NAME: !PARSE.UNTIL '['
- PROCESS.PID: !PARSE.DIGITS
- ']:'
- !PARSE.SPACES
- MESSAGE: !PARSE.CHARS

Výstup:

[
    (PRI, 141),
    (TIMESTAMP, 140994182325993472),
    (HOSTNAME, myhost.com),
    (LEVEL, notice),
    (PROCESS.NAME, tmm1),
    (PROCESS.PID, 22731),
    (MESSAGE, User 'user' was logged in.)
]

!PARSE.KV¤

Analyzuje klíč a hodnotu ze řetězce do páru klíč-hodnota, s možností přidání určité předpony.

Typ: Kombinátor

Synopse:

!PARSE.KV
- prefix: <...>
- key: <...>
- value: <...>
- <...> # volitelné prvky
  • prefix je volitelný. Pokud je specifikován, předpona bude přidána k key.
  • key a value jsou povinné.

Tip

Použijte kombinaci !PARSE.REPEAT a !PARSE.KV pro analýzu opakovaných párů klíč-hodnota. (viz příklady)

Example

Vstupní řetězec: eventID= "1011"

!PARSE.KV
- key: !PARSE.UNTIL '='
- !PARSE.SPACE
- value: !PARSE.BETWEEN {what: '"'}

Výstup: (eventID, 1011)

Analyzovat klíč a hodnotu se specifikovanou předponou

Vstupní řetězec: eventID= "1011"

!PARSE.KV
- key: !PARSE.UNTIL {what: '='}
prefix: SD.PARAM.
- !PARSE.SPACE
- value: !PARSE.BETWEEN {what: '"'}
Výstup: (SD.PARAM.eventID, 1011)

Použití spolu s !PARSE.REPEAT

Vstupní řetězec: devid="FEVM020000191439" vd="root" itime=1665629867

!PARSE.REPEAT
what: !PARSE.KV
    - !PARSE.OPTIONAL
    what: !PARSE.SPACE
    - key: !PARSE.UNTIL '='
    - value: !TRY
            - !PARSE.BETWEEN '"'
            - !PARSE.UNTIL { what: ' ', eof: true}

Výstup:

[
    (devid, FEVM020000191439),
    (vd, root),
    (itime, 1665629867)
]


!PARSE.TUPLE¤

Typ: Kombinátor

Analyzuje seznam hodnot do n-tice.

Iterováním přes seznam prvků výraz !PARSE.TUPLE shromažďuje hodnoty do n-tice.

Synopse:

!PARSE.TUPLE
- <...>
- <...>
- <...>

Example

Vstupní řetězec:_Ahoj světe!

!PARSE.TUPLE
- 'Ahoj'
- !PARSE.SPACE
- 'světe'
- '!'

Výstup: ('Ahoj', ' ', 'světe', '!')


!PARSE.RECORD¤

Analyzuje seznam hodnot do struktury záznamu.

Iterováním přes seznam prvků výraz !PARSE.RECORD shromažďuje hodnoty do struktury záznamu.

Typ: Kombinátor

Synopse:

!PARSE.RECORD
- <...>
- element1: <...>
- element2: <...>
- <...>

Example

Vstupní řetězec: <165>1

!PARSE.RECORD
- '<'
- severity: !PARSE.DIGITS
- '>'
- version: !PARSE.DIGITS
- ' '

Výstup: {'output.severity': 165, 'output.version': 1}

!PARSE.REPEAT¤

Analyzuje opakovaný vzor.

Typ: Kombinátor.

Synopse:

!PARSE.REPEAT
what: <výraz>
min: <...>
max: <...>
exactly: <...>
  • Pokud není specifikováno ani min, max, exactly, bude what opakováno co nejvíce.
  • exactly určuje přesný počet opakování.
  • min a max nastavují minimální a maximální počet opakování.

Example

Vstupní řetězec:_ host:myhost;ip:192.0.0.1;user:root;

!PARSE.KVLIST
- !PARSE.REPEAT
what: !PARSE.KV
    - key: !PARSE.UNTIL ':'
    - value: !PARSE.UNTIL ';'

To opakuje výraz !PARSE.KV co nejvíce.

Výstup:

[
    (host, myhost),
    (ip, 192.0.0.1),
    (user, root)
]

Analyzovat

Vstupní řetězec:_ ahoj ahoj ahoj Anna!

!PARSE.KVLIST
- !PARSE.REPEAT
    what: !PARSE.EXACTLY 'ahoj '
    exactly: 3
- NAME: !PARSE.UNTIL '!'

Výstup: [(NAME, Anna)]

Analyzovat

Vstupní řetězce:

ahoj ahoj Anna!
ahoj ahoj ahoj Anna!
ahoj ahoj ahoj ahoj Anna!
!PARSE.KVLIST
- !PARSE.REPEAT
    what: !PARSE.EXACTLY 'ahoj '
    min: 2
    max: 4
- NAME: !PARSE.UNTIL '!'

Výstup: [(NAME, Anna)]


!PARSE.SEPARATED¤

Analyzuje sekvenci s oddělovačem.

Typ: Kombinátor.

Synopse:

!PARSE.SEPARATED
what: <...>
sep: <...>
min: <...>
max: <...>
end: <...>
  • min a max jsou volitelné.
  • end určuje, zda je požadován koncový oddělovač. Ve výchozím nastavení je volitelný.

Example

Vstupní řetězec: 0->1->2->3

!PARSE.SEPARATED
what: !PARSE.DIGITS
sep: !PARSE.EXACTLY {what: "->"}
min: 3

Výstup: [0, 1, 2, 3]

Poznámka: koncový oddělovač je volitelný, takže vstupní řetězec 0->1->2->3-> je také platný.

Více příkladů Analyzovat what hodnoty oddělené sep v [min;max] intervalu, koncový oddělovač je požadován:
Vstupní řetězec: 11,22,33,44,55,66,
!PARSE.SEPARATED
what: !PARSE.DIGITS
sep: !PARSE.EXACTLY {what: ","}
end: True
min: 3
max: 7
Analyzovat what hodnoty oddělené sep v [min;max] intervalu, koncový oddělovač není přítomen:
Vstupní řetězec: 0..1..2..3
!PARSE.SEPARATED
what: !PARSE.DIGITS
sep: !PARSE.EXACTLY {what: ".."}
end: False
min: 3
max: 5

!PARSE.OPTIONAL¤

Analyzuje volitelný vzor.

Typ: Kombinátor

Výraz !PARSE.OPTIONAL se pokouší analyzovat vstupní řetězec pomocí specifikovaného parseru. Pokud parser selže, počáteční pozice se vrátí na počáteční.

Synopse:

!PARSE.OPTIONAL
what: <...>

nebo kratší verze:

!PARSE.OPTIONAL <...>

Example

Vstupní řetězce:

mymachine myproc[10]: DHCPACK to
mymachine myproc[10]DHCPACK to
!PARSE.KVLIST
- HOSTNAME: !PARSE.UNTIL ' ' # mymachine
- TAG: !PARSE.UNTIL '[' # myproc
- PID: !PARSE.DIGITS  # 10
- !PARSE.EXACTLY ']'

# Analýza volitelných znaků
- !PARSE.OPTIONAL ':'
- !PARSE.OPTIONAL
    what: !PARSE.SPACE

- NAME: !PARSE.UNTIL ' '

!PARSE.TRIE¤

Typ: Kombinátor.

Analyzuje pomocí počáteční předpony.

Výraz !PARSE.TRIE vybírá jednu ze specifikovaných předpon a analyzuje zbytek vstupního řetězce pomocí odpovídajícího parseru. Pokud je specifikována prázdná předpona, bude použit odpovídající parser, pokud nejsou shodnuty jiné předpony.

Synopse:

!PARSE.TRIE
- <prefix1>: <...>
- <prefix2>: <...>
...

Tip

Použijte !PARSE.TRIE pro analýzu multivariačních logových zpráv.

Example

Vstupní řetězce:

Přijato odpojení z 10.17.248.1 port 60290:11: odpojeno uživatelem
Odpojeno od uživatele root 10.17.248.1 port 60290
!PARSE.TRIE
- 'Přijato odpojení z ': !PARSE.KVLIST
                            - CLIENT_IP: !PARSE.UNTIL ' '
                            - 'port '
                            - CLIENT_PORT: !PARSE.DIGITS
                            - ':'
                            - !PARSE.CHARS
- 'Odpojeno od uživatele ': !PARSE.KVLIST
                            - USERNAME: !PARSE.UNTIL ' '
                            - CLIENT_IP: !PARSE.UNTIL ' '
                            - 'port '
                            - CLIENT_PORT: !PARSE.DIGITS
Specifikujte

Vstupní řetězec:Selhalo přihlášení pro root z 218.92.0.190

!PARSE.TRIE
- 'Přijato odpojení z ': !PARSE.KVLIST
                            - CLIENT_IP: !PARSE.UNTIL ' '
                            - 'port '
                            - CLIENT_PORT: !PARSE.DIGITS
                            - ':'
                            - !PARSE.CHARS
- 'Odpojeno od uživatele ': !PARSE.KVLIST
                            - USERNAME: !PARSE.UNTIL ' '
                            - CLIENT_IP: !PARSE.UNTIL ' '
                            - 'port '
                            - CLIENT_PORT: !PARSE.DIGITS
- '': !PARSE.KVLIST
    - tags: ["trie-match-fail"]

Výstup: [(tags, ["trie-match-fail"])]


!PARSE.CHARS.LOOKAHEAD¤

Analyzuje znaky s použitím skupiny předběžného výrazu.

Analyzuje znaky, dokud není nalezena specifikovaná skupina předběžného výrazu, a zastaví se před ní.

Typ: _K