parse 연산자
적용 대상: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
문자열 식을 평가하고 해당 값을 계산 열 하나 이상으로 구문 분석합니다. 계산 열은 실패한 구문 분석된 문자열에 대한 값을 반환 null
합니다. 구문 분석이 성공하지 않는 행을 사용할 필요가 없는 경우 구문 분석 위치 연산자를 사용하는 것이 좋습니다.
구문
T | parse
[ kind=
kind [ flags=
regexFlags ]] expression with
[ ] *
stringConstant columnName [:
columnType] [ ] ,
*
...
구문 규칙에 대해 자세히 알아봅니다.
매개 변수
이름 | Type | 필수 | 설명 |
---|---|---|---|
T | string |
✔️ | 구문 분석할 테이블 형식 입력입니다. |
kind | string |
✔️ | 지원되는 종류 값 중 하나입니다. 기본값은 simple 입니다. |
regexFlags | string |
종류인 경우 ungreedy, 다중 줄 모드s , m 일치 새 줄 \n 및 i 대/소문자를 구분하지 않는 경우처럼 U 사용할 정규식 플래그를 지정할 수 있습니다.regex 플래그에서 더 많은 플래그를 찾을 수 있습니다. |
|
expression | string |
✔️ | 문자열로 계산되는 식입니다. |
stringConstant | string |
✔️ | 검색하고 구문 분석할 문자열 상수입니다. |
columnName | string |
✔️ | 문자열 식에서 추출된 값을 할당할 열의 이름입니다. |
columnType | string |
값을 변환할 형식을 나타내는 스칼라 값입니다. 기본값은 string 입니다. |
참고 항목
- 구문 분석 패턴은 StringConstant 외에도 ColumnName으로 시작할 수 있습니다.
- 패턴에서 정크 값을 건너뛰는 데 사용합니다
*
. 형식 열 후에string
는*
사용할 수 없습니다. - 구문 분석된 식이 형식이 아니면 형식
string
string
으로 변환됩니다. - 일부 열을 삭제하거나 이름을 바꾸려는 경우에도 사용합니다
project
.
지원되는 종류 값
Text | 설명 |
---|---|
simple |
기본값입니다. stringConstant 는 일반 문자열 값이며 일치는 엄격합니다. 모든 문자열 구분 기호가 구문 분석된 문자열에 표시되어야 하고, 모든 확장 열이 필요한 형식과 일치해야 합니다. |
regex |
stringConstant 는 정규식일 수 있으며 일치는 엄격합니다. 이 모드에 대한 regex일 수 있는 모든 문자열 구분 기호가 구문 분석된 문자열에 표시되어야 하고, 모든 확장 열이 필요한 형식과 일치해야 합니다. |
relaxed |
stringConstant 는 일반 문자열 값이며 일치 항목이 완화됩니다. 모든 문자열 구분 기호는 구문 분석된 문자열에 나타나야 하지만 확장 열은 필요한 형식과 부분적으로 일치할 수 있습니다. 필요한 형식과 일치하지 않는 확장 열은 값을 null 가져옵니다. |
Regex 모드
regex 모드에서 구문 분석에서는 패턴을 regex로 변환합니다. 정규식을 사용하여 일치를 수행하고 내부적으로 처리되는 번호가 매겨진 캡처된 그룹을 사용합니다. 예시:
parse kind=regex Col with * <regex1> var1:string <regex2> var2:long
구문 분석 문에서 구문 분석에서 내부적으로 생성된 regex는 .*?<regex1>(.*?)<regex2>(\-\d+)
.
*
가.*?
로 변환되었습니다.string
가.*?
로 변환되었습니다.long
가\-\d+
로 변환되었습니다.
반환
연산자에 제공되는 열 목록에 따라 확장되는 입력 테이블입니다.
예제
parse
연산자는 동일한 string
식에서 여러 extract
애플리케이션을 사용하여 테이블을 extend
(확장)하는 효율적인 방식을 제공합니다. 이 결과는 테이블에 개별 열로 string
분할하려는 여러 값이 포함된 열이 있는 경우에 유용합니다. 예를 들어 개발자 추적(""printf
/""Console.WriteLine
) 문에 의해 생성되는 열입니다.
결과 구문 분석 및 확장
다음 예제에서 테이블 Traces
의 열 EventText
에는 폼Event: NotifySliceRelease (resourceName={0}, totalSlices={1}, sliceNumber={2}, lockTime={3}, releaseTime={4}, previousLockTime={5})
의 문자열이 포함됩니다.
이 작업은 6개의 열( , , totalSlices
, releaseTime
sliceNumber
lockTime
및 previousLockTime
)을 사용하여 테이블을 확장합니다. resourceName
let Traces = datatable(EventText: string)
[
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, 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=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=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 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
출력
resourceName에 대한 추천 사항을 찾았음 | totalSlices | sliceNumber | lockTime | releaseTime | previousLockTime |
---|---|---|---|---|---|
PipelineScheduler | 27 | 15 | 02/17/2016 08:40:00 | 2016-02-17 08:40:00.0000000 | 2016-02-17 08:39:00.0000000 |
PipelineScheduler | 27 | 23 | 02/17/2016 08:40:01 | 2016-02-17 08:40:01.0000000 | 2016-02-17 08:39:01.0000000 |
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 | 16 | 02/17/2016 08:41:00 | 2016-02-17 08:41:00.0000000 | 2016-02-17 08:40:00.0000000 |
PipelineScheduler | 27 | 22 | 02/17/2016 08:41:01 | 2016-02-17 08:41:00.0000000 | 2016-02-17 08:40:01.0000000 |
전자 메일 별칭 및 DNS 추출
다음 예제에서는 연락처 테이블의 항목을 구문 분석하여 전자 메일 주소에서 별칭 및 도메인을 추출하고 웹 사이트 URL에서 도메인을 추출합니다. 쿼리는 열 fullEmail
이 EmailAddress
구문 분석된 전자 메일 별칭과 WebsiteDomain
도메인을 결합하는 열EmailAlias
과 열을 반환합니다.
let Leads=datatable(Contacts: string)
[
"Event: LeadContact (email=john@contosohotel.com, Website=https:contosohotel.com)",
"Event: LeadContact (email=abi@fourthcoffee.com, Website=https:www.fourthcoffee.com)",
"Event: LeadContact (email=nevena@treyresearch.com, Website=https:treyresearch.com)",
"Event: LeadContact (email=faruk@tailspintoys.com, Website=https:tailspintoys.com)",
"Event: LeadContact (email=ebere@relecloud.com, Website=https:relecloud.com)",
];
Leads
| parse Contacts with * "email=" alias:string "@" domain: string ", Website=https:" WebsiteDomain: string ")"
| project EmailAddress=strcat(alias, "@", domain), EmailAlias=alias, WebsiteDomain
출력
EmailAddress | EmailAlias | WebsiteDomain |
---|---|---|
nevena@treyresearch.com | nevena | treyresearch.com |
john@contosohotel.com | John | contosohotel.com |
faruk@tailspintoys.com | faruk | tailspintoys.com |
ebere@relecloud.com | ebere | relecloud.com |
abi@fourthcoffee.com | abi | www.fourthcoffee.com |
Regex 모드
다음 예제에서는 정규식을 사용하여 열에서 데이터를 구문 분석하고 추출합니다 EventText
. 추출된 데이터는 새 필드에 프로젝션됩니다.
let Traces=datatable(EventText: string)
[
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, 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=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=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 kind=regex EventText with "(.*?)[a-zA-Z]*=" resourceName @", totalSlices=\s*\d+\s*.*?sliceNumber=" sliceNumber: long ".*?(previous)?lockTime=" lockTime ".*?releaseTime=" releaseTime ".*?previousLockTime=" previousLockTime: date "\\)"
| project resourceName, sliceNumber, lockTime, releaseTime, previousLockTime
출력
resourceName에 대한 추천 사항을 찾았음 | sliceNumber | lockTime | releaseTime | previousLockTime |
---|---|---|---|---|
PipelineScheduler | 15 | 02/17/2016 08:40:00, | 02/17/2016 08:40:00, | 2016-02-17 08:39:00.0000000 |
PipelineScheduler | 23 | 02/17/2016 08:40:01, | 02/17/2016 08:40:01, | 2016-02-17 08:39:01.0000000 |
PipelineScheduler | 20 | 02/17/2016 08:40:01, | 02/17/2016 08:40:01, | 2016-02-17 08:39:01.0000000 |
PipelineScheduler | 16 | 02/17/2016 08:41:00, | 02/17/2016 08:41:00, | 2016-02-17 08:40:00.0000000 |
PipelineScheduler | 22 | 02/17/2016 08:41:01, | 02/17/2016 08:41:00, | 2016-02-17 08:40:01.0000000 |
regex 플래그가 있는 Regex 모드
다음 예제 resourceName
에서는 추출됩니다.
let Traces=datatable(EventText: string)
[
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, 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=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=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 kind=regex EventText with * "resourceName=" resourceName ',' *
| project resourceName
출력
resourceName에 대한 추천 사항을 찾았음 |
---|
PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01 |
PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=02/17/2016 08:40:00 |
PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01 |
PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00 |
PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00 |
경우에 따라 소문자로 표시되고 대문자로 표시되는 레코드가 있는 resourceName
경우 일부 값에 대해 null을 가져올 수 있습니다.
이전 예제의 결과는 예기치 않으며 기본 모드가 greedy이므로 전체 이벤트 데이터를 포함합니다.
추출만 resourceName
하려면 이전 쿼리를 non-greedy U
로 실행하고 대/소문자를 구분 i
하는 정규식 플래그를 사용하지 않도록 설정합니다.
let Traces=datatable(EventText: string)
[
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, 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=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=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 kind=regex flags=Ui EventText with * "RESOURCENAME=" resourceName ',' *
| project resourceName
출력
resourceName에 대한 추천 사항을 찾았음 |
---|
PipelineScheduler |
PipelineScheduler |
PipelineScheduler |
PipelineScheduler |
PipelineScheduler |
구문 분석된 문자열에 줄 바꿈이 있는 경우 플래그 s
를 사용하여 텍스트를 구문 분석합니다.
let Traces=datatable(EventText: string)
[
"Event: NotifySliceRelease (resourceName=PipelineScheduler\ntotalSlices=27\nsliceNumber=23\nlockTime=02/17/2016 08:40:01\nreleaseTime=02/17/2016 08:40:01\npreviousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler\ntotalSlices=27\nsliceNumber=15\nlockTime=02/17/2016 08:40:00\nreleaseTime=02/17/2016 08:40:00\npreviousLockTime=02/17/2016 08:39:00)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler\ntotalSlices=27\nsliceNumber=20\nlockTime=02/17/2016 08:40:01\nreleaseTime=02/17/2016 08:40:01\npreviousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler\ntotalSlices=27\nsliceNumber=22\nlockTime=02/17/2016 08:41:01\nreleaseTime=02/17/2016 08:41:00\npreviousLockTime=02/17/2016 08:40:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler\ntotalSlices=27\nsliceNumber=16\nlockTime=02/17/2016 08:41:00\nreleaseTime=02/17/2016 08:41:00\npreviousLockTime=02/17/2016 08:40:00)"
];
Traces
| parse kind=regex flags=s EventText with * "resourceName=" resourceName: string "(.*?)totalSlices=" totalSlices: long "(.*?)lockTime=" lockTime: datetime "(.*?)releaseTime=" releaseTime: datetime "(.*?)previousLockTime=" previousLockTime: datetime "\\)"
| project-away EventText
출력
resourceName에 대한 추천 사항을 찾았음 | totalSlices | lockTime | releaseTime | previousLockTime |
---|---|---|---|---|
PipelineScheduler |
27 | 2016-02-17 08:40:00.0000000 | 2016-02-17 08:40:00.0000000 | 2016-02-17 08:39:00.0000000 |
PipelineScheduler |
27 | 2016-02-17 08:40:01.0000000 | 2016-02-17 08:40:01.0000000 | 2016-02-17 08:39:01.0000000 |
PipelineScheduler |
27 | 2016-02-17 08:40:01.0000000 | 2016-02-17 08:40:01.0000000 | 2016-02-17 08:39:01.0000000 |
PipelineScheduler |
27 | 2016-02-17 08:41:00.0000000 | 2016-02-17 08:41:00.0000000 | 2016-02-17 08:40:00.0000000 |
PipelineScheduler |
27 | 2016-02-17 08:41:01.0000000 | 2016-02-17 08:41:00.0000000 | 2016-02-17 08:40:01.0000000 |
relaxed 모드
다음 완화 모드 예제에서 확장 열 totalSlices
은 형식 long
이어야 합니다. 그러나 구문 분석된 문자열에는 값 nonValidLongValue
이 있습니다.
확장 열 releaseTime
의 경우 값을 nonValidDateTime
.로 datetime
구문 분석할 수 없습니다.
이러한 두 확장 열은 값을 생성 null
하지만 다른 열(예: sliceNumber
)은 여전히 올바른 값을 생성합니다.
다음 쿼리에 옵션을 사용하면 kind = simple
모든 확장 열에 대한 결과를 얻을 수 null
있습니다. 이 옵션은 확장 열에서 엄격하며 완화 모드와 단순 모드의 차이입니다.
참고 항목
완화 모드에서는 확장 열을 부분적으로 일치시킬 수 있습니다.
let Traces=datatable(EventText: string)
[
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01, releaseTime=nonValidDateTime 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=nonValidDateTime, previousLockTime=02/17/2016 08:39:00)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=nonValidLongValue, sliceNumber=20, lockTime=02/17/2016 08:40:01, releaseTime=nonValidDateTime 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=nonValidLongValue, 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 kind=relaxed EventText with * "resourceName=" resourceName ", totalSlices=" totalSlices: long ", sliceNumber=" sliceNumber: long * "lockTime=" lockTime ", releaseTime=" releaseTime: date "," * "previousLockTime=" previousLockTime: date ")" *
| project-away EventText
출력
resourceName에 대한 추천 사항을 찾았음 | totalSlices | sliceNumber | lockTime | releaseTime | previousLockTime |
---|---|---|---|---|---|
PipelineScheduler | 27 | 15 | 02/17/2016 08:40:00 | 2016-02-17 08:39:00.0000000 | |
PipelineScheduler | 27 | 23 | 02/17/2016 08:40:01 | 2016-02-17 08:39:01.0000000 | |
PipelineScheduler | 20 | 02/17/2016 08:40:01 | 2016-02-17 08:39:01.0000000 | ||
PipelineScheduler | 16 | 02/17/2016 08:41:00 | 2016-02-17 08:41:00.0000000 | 2016-02-17 08:40:00.0000000 | |
PipelineScheduler | 27 | 22 | 02/17/2016 08:41:01 | 2016-02-17 08:41:00.0000000 | 2016-02-17 08:40:01.0000000 |