비구조적 문자열 필드에서 데이터 추출

완료됨

보안 로그 데이터는 구조화되지 않은 문자열 필드에 포함되는 경우가 많으며 데이터를 추출하기 위해 구문 분석이 필요합니다. KQL의 문자열 필드에서 정보를 가져오는 방법은 다양합니다. 주로 사용하는 두 개의 기본 연산자는 추출 및 구문 분석입니다.

extract

텍스트 문자열에서 정규식에 일치하는 항목을 추출합니다. 선택적으로 추출된 하위 문자열을 지정된 형식으로 변환할 수 있습니다.

print extract("x=([0-9.]+)", 1, "hello x=45.6|wo") == "45.6"

인수

  • regex: 정규식.

  • captureGroup: 추출할 캡처 그룹을 나타내는 양의 상수입니다. “0”은 전체 일치, “1”은 정규식의 첫 번째‘(‘괄호’)’에 의해 일치된 값, 2 이상은 이후 괄호를 나타냅니다.

  • text: 검색할 문자열입니다.

  • typeLiteral: 선택 가능한 리터럴 유형(예: typeof(long)). 제공된 경우 추출된 부분 문자열이 이 형식으로 변환됩니다.

반환

regex가 text에서 일치 항목을 찾은 경우: 지시된 캡처 그룹 captureGroup에 대해 일치된 부분 문자열, 선택적으로 typeLiteral로 변환됩니다.

일치 항목이 없거나 형식 변환이 실패하는 경우 Null을 반환합니다.

다음 예시에서는 추출 함수를 사용하여 SecurityEvent 테이블의 Account 필드에서 Account Name을 가져옵니다.

SecurityEvent
| where EventID == 4672 and AccountType == 'User'
| extend Account_Name = extract(@"^(.*\\)?([^@]*)(@.*)?$", 2, tolower(Account))
| summarize LoginCount = count() by Account_Name
| where Account_Name != ""
| where LoginCount < 10

parse

Parse는 문자열 식을 평가하고 해당 값을 계산 열 하나 이상으로 구문 분석합니다. 계산된 열에는 구문 분석에 실패한 문자열에 대한 Null이 포함됩니다.

Syntax

T | parse [kind=regex [flags=regex_flags] |simple|relaxed] Expression with * (StringConstant ColumnName [: ColumnType]) *

인수

  • T: 입력 테이블입니다.

  • kind:

    • simple(기본값): StringConstant는 일반 문자열 값이며, 일치가 엄격합니다. 모든 문자열 구분 기호가 구문 분석된 문자열에 표시되어야 하고, 모든 확장 열이 필요한 형식과 일치해야 합니다.

    • regex: StringConstant는 정규식일 수 있으며, 일치가 엄격합니다. 이 모드에 대한 regex일 수 있는 모든 문자열 구분 기호가 구문 분석된 문자열에 표시되어야 하고, 모든 확장 열이 필요한 형식과 일치해야 합니다.

    • flags: U(Ungreedy), m(multi-line mode), s(match new line \n), i(case-insensitive)와 같이 RE2 플래그의 정규식 모드에서 사용될 플래그입니다.

    • relaxed: StringConstant는 일반 문자열 값이며, 일치가 느슨합니다. 모든 문자열 구분 기호가 구문 분석된 문자열에 표시되어야 하지만, 확장 열이 필요한 형식과 부분적으로 일치할 수 있습니다. 필요한 형식과 일치하지 않는 확장 열은 null 값을 얻습니다.

  • 식: 문자열로 계산되는 식입니다.

  • ColumnName: 문자열 식에서 추출된 값을 할당할 열의 이름입니다.

  • ColumnType: (선택 사항) 값을 변환할 형식을 나타내는 스칼라 값입니다. 기본값은 문자열 형식입니다.

반환

연산자에 제공되는 열 목록에 따라 확장되는 입력 테이블입니다.

다음 문은 문자열 식을 평가하고 해당 값을 하나 이상의 계산 열로 구문 분석하는 parse 연산자를 보여 줍니다. 비정형 데이터를 구조화하는 데 사용합니다.

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