다음을 통해 공유


parse 연산자

적용 대상: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

문자열 식을 평가하고 해당 값을 계산 열 하나 이상으로 구문 분석합니다. 계산 열은 실패한 구문 분석된 문자열에 대한 값을 반환 null 합니다. 구문 분석이 성공하지 않는 행을 사용할 필요가 없는 경우 구문 분석 위치 연산자를 사용하는 것이 좋습니다.

구문

T | parse [ kind=kind [ flags=regexFlags ]] expression with [ ] * stringConstant columnName [: columnType] [ ] , * ...

구문 규칙에 대해 자세히 알아봅니다.

매개 변수

이름 Type 필수 설명
T string ✔️ 구문 분석할 테이블 형식 입력입니다.
kind string ✔️ 지원되는 종류 값하나입니다. 기본값은 simple입니다.
regexFlags string 종류인 경우 ungreedy, 다중 줄 모드s, m 일치 새 줄 \ni 대/소문자를 구분하지 않는 경우처럼 U 사용할 정규식 플래그를 지정할 수 있습니다.regex 플래그에서 더 많은 플래그찾을 수 있습니다.
expression string ✔️ 문자열로 계산되는 식입니다.
stringConstant string ✔️ 검색하고 구문 분석할 문자열 상수입니다.
columnName string ✔️ 문자열 식에서 추출된 값을 할당할 열의 이름입니다.
columnType string 값을 변환할 형식을 나타내는 스칼라 값입니다. 기본값은 string입니다.

참고 항목

  • 구문 분석 패턴은 StringConstant 외에도 ColumnName으로 시작할 수 있습니다.
  • 패턴에서 정크 값을 건너뛰는 데 사용합니다 * . 형식 열 후에 string* 사용할 수 없습니다.
  • 구문 분석된 이 형식이 아니면 형식stringstring으로 변환됩니다.
  • 일부 열을 삭제하거나 이름을 바꾸려는 경우에도 사용합니다 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, releaseTimesliceNumberlockTimepreviousLockTime)을 사용하여 테이블을 확장합니다. 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에서 도메인을 추출합니다. 쿼리는 열 fullEmailEmailAddress구문 분석된 전자 메일 별칭과 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