Sdílet prostřednictvím


Operátor parse-where

Platí pro: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft Sentinel

Vyhodnotí řetězcový výraz a parsuje jeho hodnotu do jednoho nebo více počítaných sloupců. Výsledkem jsou pouze úspěšně analyzované řetězce.

parse-where parsuje řetězce stejným způsobem jako analýza a filtruje řetězce, které nebyly úspěšně analyzovány.

Viz operátor parse, který vytváří hodnoty null pro neúspěšně parsované řetězce.

Syntaxe

T | parse-where [kind=kind [flags= regexFlags]] výraz with * (stringConstant columnName [: columnType]) *...

Přečtěte si další informace o konvencích syntaxe.

Parametry

Název Type Požadováno Popis
T string ✔️ Tabulkový vstup, který se má analyzovat.
laskavý string ✔️ Jedna z podporovaných hodnot typu Výchozí hodnota je simple.
regexFlags string Pokud je typ , můžete určit příznaky regulárních výrazů, které se mají použít jako U pro nerozdělené, m pro víceřádkový režim, s pro shodu nového řádku \na pro nerozlišující velká a i regexmalá písmena. Další příznaky najdete v příznakech.
výraz string ✔️ Výraz, který se vyhodnotí jako řetězec.
stringConstant string ✔️ Řetězcová konstanta, pro kterou se má hledat a parsovat.
columnName string ✔️ Název sloupce, ke kterému se má přiřadit hodnota extrahovaná z řetězcového výrazu.
columnType string Skalární hodnota označující typ, na který se má hodnota převést. Výchozí hodnota je string.

Poznámka:

Podporované hodnoty typu

Text Popis
simple Tato hodnota je výchozí. stringConstant je běžná řetězcová hodnota a shoda je striktní. Všechny oddělovače řetězců by se měly objevit v analyzovaném řetězci a všechny rozšířené sloupce musí odpovídat požadovaným typům.
regex stringConstant může být regulární výraz a shoda je striktní. Všechny oddělovače řetězců, které mohou být výrazem regex pro tento režim, by se měly objevit v analyzovaném řetězci a všechny rozšířené sloupce musí odpovídat požadovaným typům.

Režim regulárních výrazů

V režimu regulárního výrazu parse přeloží vzor na regulární výrazy a použije regulární výrazy k tomu, aby se shodovaly pomocí očíslovaných zachycených skupin, které se zpracovávají interně. Příklad:

parse-where kind=regex Col with * <regex1> var1:string <regex2> var2:long

Regulární výraz, který se vygeneruje interně parsováním, je .*?<regex1>(.*?)<regex2>(\-\d+).

  • * byl přeložen do .*?.
  • string byl přeložen do .*?.
  • long byl přeložen do \-\d+.

Návraty

Vstupní tabulka, která je rozšířena podle seznamu sloupců, které jsou zadané operátoru.

Poznámka:

Ve výstupu budou pouze úspěšně analyzované řetězce. Řetězce, které neodpovídají vzoru, se vyfiltrují.

Příklady

Operátor parse-where poskytuje zjednodušený způsob, jak do extend tabulky použít více extract aplikací ve stejném string výrazu. To je nejužitečnější, když tabulka obsahuje string sloupec, který obsahuje několik hodnot, které chcete rozdělit do jednotlivých sloupců. Můžete například rozdělit sloupec, který byl vytvořen příkazem trasování vývojáře ("printf/"Console.WriteLine").

Používání akce parse

V následujícím příkladu sloupec EventText tabulky Traces obsahuje řetězce formuláře Event: NotifySliceRelease (resourceName={0}, totalSlices= {1}, sliceNumber={2}, lockTime={3}, releaseTime={4}, previousLockTime={5}). Následující operace rozšíří tabulku o šest sloupců: , , , , , , MonthpreviousLockTimea Day. releaseTimelockTimesliceNumbertotalSlicesresourceName

Několik řetězců nemá úplnou shodu.

Pomocí parsepočítaných sloupců budou mít hodnoty null.

let Traces = datatable(EventText: string)
    [
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=invalid_number, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=invalid_datetime, previousLockTime=02/17/2016 08:39:00)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=invalid_number, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces  
| parse EventText with * "resourceName=" resourceName ", totalSlices=" totalSlices: long * "sliceNumber=" sliceNumber: long * "lockTime=" lockTime ", releaseTime=" releaseTime: date "," * "previousLockTime=" previouLockTime: date ")" *  
| project
    resourceName,
    totalSlices,
    sliceNumber,
    lockTime,
    releaseTime,
    previouLockTime

Výstup

resourceName: totalSlices sliceNumber lockTime releaseTime previousLockTime
PipelineScheduler 27 20 02/17/2016 08:40:01 2016-02-17 08:40:01.0000000 2016-02-17 08:39:01.0000000
PipelineScheduler 27 22 02/17/2016 08:41:01 2016-02-17 08:41:00.0000000 2016-02-17 08:40:01.0000000

Používání akce parse-where

Při použití funkce parse-where se úspěšně parsují řetězce z výsledku.

let Traces = datatable(EventText: string)
    [
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=invalid_number, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=invalid_datetime, previousLockTime=02/17/2016 08:39:00)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=invalid_number, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces  
| parse-where EventText with * "resourceName=" resourceName ", totalSlices=" totalSlices: long * "sliceNumber=" sliceNumber: long * "lockTime=" lockTime ", releaseTime=" releaseTime: date "," * "previousLockTime=" previousLockTime: date ")" *  
| project
    resourceName,
    totalSlices,
    sliceNumber,
    lockTime,
    releaseTime,
    previousLockTime

Výstup

resourceName: totalSlices sliceNumber lockTime releaseTime previousLockTime
PipelineScheduler 27 20 02/17/2016 08:40:01 2016-02-17 08:40:01.0000000 2016-02-17 08:39:01.0000000
PipelineScheduler 27 22 02/17/2016 08:41:01 2016-02-17 08:41:00.0000000 2016-02-17 08:40:01.0000000

Režim regulárních výrazů s využitím příznaků regulárních výrazů

Pokud chcete získat resourceName a totalSlices, použijte následující dotaz:

let Traces = datatable(EventText: string)
    [
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=non_valid_integer, sliceNumber=11, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=02/17/2016 08:40:00, previousLockTime=02/17/2016 08:39:00)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=non_valid_integer, sliceNumber=44, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces
| parse-where kind = regex EventText with * "RESOURCENAME=" resourceName "," * "totalSlices=" totalSlices: long "," *
| project resourceName, totalSlices

Výstup

resourceName: totalSlices

parse-where s příznakem regulárního výrazu nerozlišující malá a velká písmena

Ve výše uvedeném dotazu se u výchozího režimu rozlišují malá a velká písmena, takže řetězce se úspěšně parsovaly. Nebyl získán žádný výsledek.

Chcete-li získat požadovaný výsledek, spusťte parse-where příznak regulárního výrazu nerozlišujícíi malá a velká písmena ().

Úspěšně se parsují pouze tři řetězce, takže výsledkem jsou tři záznamy (některé totalSlices obsahují neplatná celá čísla).

let Traces = datatable(EventText: string)
    [
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=non_valid_integer, sliceNumber=11, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=02/17/2016 08:40:00, previousLockTime=02/17/2016 08:39:00)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=non_valid_integer, sliceNumber=44, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces
| parse-where kind = regex flags=i EventText with * "RESOURCENAME=" resourceName "," * "totalSlices=" totalSlices: long "," *
| project resourceName, totalSlices

Výstup

resourceName: totalSlices
PipelineScheduler 27
PipelineScheduler 27
PipelineScheduler 27