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:
!PARSE.KVLIST
: Analyzuje sekvenci klíčů a hodnot do typu tašky.!PARSE.KV
: Analyzuje klíč a hodnotu ze vstupního řetězce.!PARSE.TUPLE
: Analyzuje do typu n-tice.!PARSE.RECORD
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.CHARS.LOOKAHEAD
: Analyzuje, dokud není nalezena určitá sekvence znaků ve řetězci.
!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 kkey
.key
avalue
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: '"'}
(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
, budewhat
opakováno co nejvíce. exactly
určuje přesný počet opakování.min
amax
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
amax
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ů
Analyzovatwhat
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
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