Azure Monitor ログ クエリ内の文字列を操作するWork with strings in Azure Monitor log queries

注意

このチュートリアルを完了する前に、「Azure Monitor ログ分析の使用を開始する」と、Azure Monitor ログ クエリの使用の開始に関するチュートリアルを完了しておく必要があります。You should complete Get started with Azure Monitor Log Analytics and Getting started with Azure Monitor log queries before completing this tutorial.

注意

ご自身の Log Analytics 環境でこの演習を行うことも、多数のサンプル データが含まれているデモ環境を使用することもできます。You can work through this exercise in your own Log Analytics environment, or you can use our Demo environment, which includes plenty of sample data.

この記事では、文字列での編集、比較、検索、およびその他さまざまな操作を実行する方法について説明します。This article describes how to edit, compare, search in and perform a variety of other operations on strings.

文字列内の文字にはそれぞれ、その場所に従ってインデックス番号が付いています。Each character in a string has an index number, according to its location. 最初の文字はインデックス 0、次の文字は 1、以降、同様に続きます。The first character is at index 0, the next character is 1, and so on. 以降のセクションで示すように、さまざまな文字列関数でインデックス番号が使用されています。Different string functions use index numbers as shown in the following sections. 特定のデータ ソースを使用せずに文字列操作を示すために、次の例の多くで print コマンドが使用されています。Many of the following examples use the print command for to demonstrate string manipulation without using a specific data source.

文字列とそのエスケープStrings and escaping them

文字列の値は、一重引用符または二重引用符のいずれかで囲まれています。String values are wrapped with either with single or double quote characters. バックスラッシュ (\) はエスケープ文字で、その次の文字をエスケープします。たとえば、\t はタブを、\n は改行を、そして " は引用符自体を表します。Backslash (\) is used to escape characters to the character following it, such as \t for tab, \n for newline, and " the quote character itself.

print "this is a 'string' literal in double \" quotes"
print 'this is a "string" literal in single \' quotes'

"\" がエスケープ文字として機能しないようにするには、文字列に "@" をプレフィックスとして追加します。To prevent "\" from acting as an escape character, add "@" as a prefix to the string:

print @"C:\backslash\not\escaped\with @ prefix"

文字列の比較String comparisons

演算子Operator 説明Description 大文字と小文字の区別Case-Sensitive 例 (true になる)Example (yields true)
== 等しいEquals はいYes "aBc" == "aBc"
!= 等しくないNot equals はいYes "abc" != "ABC"
=~ 等しいEquals いいえNo "abc" =~ "ABC"
!~ 等しくないNot equals いいえNo "aBc" !~ "xyz"
has 右辺が左辺の完全な用語として含まれるRight-hand-side is a whole term in left-hand-side いいえNo "North America" has "america"
!has 右辺が左辺の完全な用語として含まれないRight-hand-side isn't a full term in left-hand-side いいえNo "North America" !has "amer"
has_cs 右辺が左辺の完全な用語として含まれるRight-hand-side is a whole term in left-hand-side はいYes "North America" has_cs "America"
!has_cs 右辺が左辺の完全な用語として含まれないRight-hand-side isn't a full term in left-hand-side はいYes "North America" !has_cs "amer"
hasprefix 右辺が左辺の用語のプレフィックスとして含まれるRight-hand-side is a term prefix in left-hand-side いいえNo "North America" hasprefix "ame"
!hasprefix 右辺が左辺の用語のプレフィックスとして含まれないRight-hand-side isn't a term prefix in left-hand-side いいえNo "North America" !hasprefix "mer"
hasprefix_cs 右辺が左辺の用語のプレフィックスとして含まれるRight-hand-side is a term prefix in left-hand-side はいYes "North America" hasprefix_cs "Ame"
!hasprefix_cs 右辺が左辺の用語のプレフィックスとして含まれないRight-hand-side isn't a term prefix in left-hand-side はいYes "North America" !hasprefix_cs "CA"
hassuffix 右辺が左辺の用語のサフィックスとして含まれるRight-hand-side is a term suffix in left-hand-side いいえNo "North America" hassuffix "ica"
!hassuffix 右辺が左辺の用語のサフィックスに含まれないRight-hand-side isn't a term suffix in left-hand-side いいえNo "North America" !hassuffix "americ"
hassuffix_cs 右辺が左辺の用語のサフィックスとして含まれるRight-hand-side is a term suffix in left-hand-side はいYes "North America" hassuffix_cs "ica"
!hassuffix_cs 右辺が左辺の用語のサフィックスに含まれないRight-hand-side isn't a term suffix in left-hand-side はいYes "North America" !hassuffix_cs "icA"
contains 右辺が左辺のサブシーケンスとして出現するRight-hand-side occurs as a subsequence of left-hand-side いいえNo "FabriKam" contains "BRik"
!contains 右辺が左辺のサブシーケンスとして出現しないRight-hand-side doesn't occur in left-hand-side いいえNo "Fabrikam" !contains "xyz"
contains_cs 右辺が左辺のサブシーケンスとして出現するRight-hand-side occurs as a subsequence of left-hand-side はいYes "FabriKam" contains_cs "Kam"
!contains_cs 右辺が左辺のサブシーケンスとして出現しないRight-hand-side doesn't occur in left-hand-side はいYes "Fabrikam" !contains_cs "Kam"
startswith 右辺が左辺の先頭のサブシーケンスであるRight-hand-side is an initial subsequence of left-hand-side いいえNo "Fabrikam" startswith "fab"
!startswith 右辺が左辺の先頭のサブシーケンスでないRight-hand-side isn't an initial subsequence of left-hand-side いいえNo "Fabrikam" !startswith "kam"
startswith_cs 右辺が左辺の先頭のサブシーケンスであるRight-hand-side is an initial subsequence of left-hand-side はいYes "Fabrikam" startswith_cs "Fab"
!startswith_cs 右辺が左辺の先頭のサブシーケンスでないRight-hand-side isn't an initial subsequence of left-hand-side はいYes "Fabrikam" !startswith_cs "fab"
endswith 右辺が左辺の末尾のサブシーケンスであるRight-hand-side is a closing subsequence of left-hand-side いいえNo "Fabrikam" endswith "Kam"
!endswith 右辺が左辺の末尾のサブシーケンスでないRight-hand-side isn't a closing subsequence of left-hand-side いいえNo "Fabrikam" !endswith "brik"
endswith_cs 右辺が左辺の末尾のサブシーケンスであるRight-hand-side is a closing subsequence of left-hand-side はいYes "Fabrikam" endswith "Kam"
!endswith_cs 右辺が左辺の末尾のサブシーケンスでないRight-hand-side isn't a closing subsequence of left-hand-side はいYes "Fabrikam" !endswith "brik"
matches regex 左辺には右辺の一致が含まれているleft-hand-side contains a match for Right-hand-side はいYes "Fabrikam" matches regex "b.*k"
in 要素のいずれかに等しいEquals to one of the elements はいYes "abc" in ("123", "345", "abc")
!in 要素のいずれとも等しくないNot equals to any of the elements はいYes "bca" !in ("123", "345", "abc")

countofcountof

文字列内の部分文字列の出現回数をカウントします。Counts occurrences of a substring in a string. プレーン文字列と照合できます。または正規表現を使用できます。Can match plain strings or use regex. プレーン文字列の一致は重複する可能性があります。正規表現の一致は重複しません。Plain string matches may overlap while regex matches do not.

構文Syntax

countof(text, search [, kind])

引数:Arguments:

  • text - 入力文字列text - The input string
  • search - text 内で一致するプレーン文字列または正規表現。search - Plain string or regular expression to match inside text.
  • kind - normal | regex (既定: normal)。kind - normal | regex (default: normal).

戻り値Returns

コンテナー内で検索文字列が一致する回数。The number of times that the search string can be matched in the container. プレーン文字列の一致は重複する可能性があります。正規表現の一致は重複しません。Plain string matches may overlap while regex matches do not.

Examples

プレーン文字列の一致Plain string matches

print countof("The cat sat on the mat", "at");  //result: 3
print countof("aaa", "a");  //result: 3
print countof("aaaa", "aa");  //result: 3 (not 2!)
print countof("ababa", "ab", "normal");  //result: 2
print countof("ababa", "aba");  //result: 2

正規表現の一致Regex matches

print countof("The cat sat on the mat", @"\b.at\b", "regex");  //result: 3
print countof("ababa", "aba", "regex");  //result: 1
print countof("abcabc", "a.c", "regex");  // result: 2

extractextract

指定された文字列から正規表現との一致を取得します。Gets a match for a regular expression from a given string. 必要に応じて、抽出された部分文字列を、指定された型に変換することもできます。Optionally also converts the extracted substring to the specified type.

構文Syntax

extract(regex, captureGroup, text [, typeLiteral])

引数Arguments

  • regex - 正規表現。regex - A regular expression.
  • captureGroup - 抽出するキャプチャ グループを示す正の整数の定数。captureGroup - A positive integer constant indicating the capture group to extract. 0 は一致全体、1 は正規表現の最初のかっこで囲まれた部分と一致した値、2 以上は後続のかっこを示します。0 for the entire match, 1 for the value matched by the first '('parenthesis')' in the regular expression, 2 or more for subsequent parentheses.
  • text - 検索する文字列。text - A string to search.
  • typeLiteral - オプションの type リテラル (例: typeof(long))。typeLiteral - An optional type literal (for example, typeof(long)). 指定した場合、抽出された部分文字列はこの型に変換されます。If provided, the extracted substring is converted to this type.

戻り値Returns

指定されたキャプチャ グループ captureGroup に対応する部分文字列。オプションで、typeLiteral に変換できます。The substring matched against the indicated capture group captureGroup, optionally converted to typeLiteral. 一致がないか、型変換が失敗した場合は、null 値を返します。If there's no match, or the type conversion fails, return null.

Examples

次の例では、ハートビート レコードから ComputerIP の最終オクテットを抽出します。The following example extracts the last octet of ComputerIP from a heartbeat record:

Heartbeat
| where ComputerIP != "" 
| take 1
| project ComputerIP, last_octet=extract("([0-9]*$)", 1, ComputerIP) 

次の例では、最終オクテットを抽出して real 型 (数値) にキャストし、次の IP 値を計算しますThe following example extracts the last octet, casts it to a real type (number) and calculates the next IP value

Heartbeat
| where ComputerIP != "" 
| take 1
| extend last_octet=extract("([0-9]*$)", 1, ComputerIP, typeof(real)) 
| extend next_ip=(last_octet+1)%255
| project ComputerIP, last_octet, next_ip

次の例では、文字列 Trace で "Duration" の定義を検索します。In the example below, the string Trace is searched for a definition of "Duration". 一致は real にキャストされた後、"Duration を timespan 型にキャストする" 時間定数 (1 s) で乗算されます。The match is cast to real and multiplied by a time constant (1 s) which casts Duration to type timespan.

let Trace="A=12, B=34, Duration=567, ...";
print Duration = extract("Duration=([0-9.]+)", 1, Trace, typeof(real));  //result: 567
print Duration_seconds =  extract("Duration=([0-9.]+)", 1, Trace, typeof(real)) * time(1s);  //result: 00:09:27

isempty、isnotempty、notemptyisempty, isnotempty, notempty

  • isempty は、引数が空の文字列または null 値の場合に true を返します (isnull も参照)。isempty returns true if the argument is an empty string or null (see also isnull).
  • isnotempty は、引数が空の文字列または null 値でない場合に true を返します (isnotnull も参照)。isnotempty returns true if the argument isn't an empty string or a null (see also isnotnull). 別名: notemptyalias: notempty.

構文Syntax

isempty(value)
isnotempty(value)

Examples

print isempty("");  // result: true

print isempty("0");  // result: false

print isempty(0);  // result: false

print isempty(5);  // result: false

Heartbeat | where isnotempty(ComputerIP) | take 1  // return 1 Heartbeat record in which ComputerIP isn't empty

parseurlparseurl

URL をパーツ (プロトコル、ホスト、ポートなど) に分割し、そのパーツが文字列として含まれるディクショナリ オブジェクトを返します。Splits a URL into its parts (protocol, host, port, etc.), and returns a dictionary object containing the parts as strings.

構文Syntax

parseurl(urlstring)

Examples

print parseurl("http://user:pass@contoso.com/icecream/buy.aspx?a=1&b=2#tag")

結果は次のとおりです。The outcome will be:

{
    "Scheme" : "http",
    "Host" : "contoso.com",
    "Port" : "80",
    "Path" : "/icecream/buy.aspx",
    "Username" : "user",
    "Password" : "pass",
    "Query Parameters" : {"a":"1","b":"2"},
    "Fragment" : "tag"
}

replacereplace

正規表現のすべての一致を別の文字列で置き換えます。Replaces all regex matches with another string.

構文Syntax

replace(regex, rewrite, input_text)

引数Arguments

  • regex - 照合する正規表現。regex - The regular expression to match by. 複数のキャプチャ グループをかっこ内に含めることができます。It can contain capture groups in '('parentheses')'.
  • rewrite - 照合する正規表現と一致したものすべてが置き換えられた後の正規表現。rewrite - The replacement regex for any match made by matching regex. 完全一致を参照する場合は \0、最初のキャプチャ グループの場合は \1、後続のキャプチャ グループの場合は \2 などを使用します。Use \0 to refer to the whole match, \1 for the first capture group, \2, and so on for subsequent capture groups.
  • input_text - 検索場所を示す入力文字列。input_text - The input string to search in.

戻り値Returns

regex とのすべての一致が rewrite の評価で置き換えられた後のテキスト。The text after replacing all matches of regex with evaluations of rewrite. 一致が重複することはありません。Matches don't overlap.

Examples

SecurityEvent
| take 1
| project Activity 
| extend replaced = replace(@"(\d+) -", @"Activity ID \1: ", Activity) 

結果は次のとおりです。Can have the following results:

アクティビティActivity replacedreplaced
4663 - オブジェクトへのアクセスが試行されました4663 - An attempt was made to access an object アクティビティ ID 4663: オブジェクトへのアクセスが試行されました。Activity ID 4663: An attempt was made to access an object.

splitsplit

指定された文字列を、指定された区切り記号に従って分割し、結果の部分文字列の配列を返します。Splits a given string according to a specified delimiter, and returns an array of the resulting substrings.

構文Syntax

split(source, delimiter [, requestedIndex])

引数:Arguments:

  • source - 指定された区切り記号に従って分割する文字列。source - The string to be split according to the specified delimiter.
  • delimiter - ソース文字列の分割に使用される区切り記号。delimiter - The delimiter that will be used in order to split the source string.
  • requestedIndex - 0 から始まるインデックス (省略可能)。requestedIndex - An optional zero-based index. 指定した場合、返される文字列配列にはその項目のみが含まれます (存在する場合)。If provided, the returned string array will hold only that item (if exists).

Examples

print split("aaa_bbb_ccc", "_");    // result: ["aaa","bbb","ccc"]
print split("aa_bb", "_");          // result: ["aa","bb"]
print split("aaa_bbb_ccc", "_", 1); // result: ["bbb"]
print split("", "_");               // result: [""]
print split("a__b", "_");           // result: ["a","","b"]
print split("aabbcc", "bb");        // result: ["aa","cc"]

strcatstrcat

文字列引数を連結します (1 から 16 の引数をサポート)。Concatenates string arguments (supports 1-16 arguments).

構文Syntax

strcat("string1", "string2", "string3")

Examples

print strcat("hello", " ", "world") // result: "hello world"

strlenstrlen

文字列の長さを返します。Returns the length of a string.

構文Syntax

strlen("text_to_evaluate")

Examples

print strlen("hello")   // result: 5

substringsubstring

指定されたソース文字列から、指定されたインデックス位置以降にある部分文字列を抽出します。Extracts a substring from a given source string, starting at the specified index. 必要に応じて、要求する部分文字列の長さを指定できます。Optionally, the length of the requested substring can be specified.

構文Syntax

substring(source, startingIndex [, length])

引数:Arguments:

  • source - 部分文字列の取得元となるソース文字列。source - The source string that the substring will be taken from.
  • startingIndex - 要求する部分文字列の、0 から始まる開始文字位置。startingIndex - The zero-based starting character position of the requested substring.
  • length - 要求する部分文字列に対して返される文字数の指定に使用できる省略可能なパラメーター。length - An optional parameter that can be used to specify the requested length of the returned substring.

Examples

print substring("abcdefg", 1, 2);   // result: "bc"
print substring("123456", 1);       // result: "23456"
print substring("123456", 2, 2);    // result: "34"
print substring("ABCD", 0, 2);  // result: "AB"

tolower、touppertolower, toupper

指定された文字列を、すべて小文字またはすべて大文字に変換します。Converts a given string to all lower or upper case.

構文Syntax

tolower("value")
toupper("value")

Examples

print tolower("HELLO"); // result: "hello"
print toupper("hello"); // result: "HELLO"

次のステップNext steps

高度なチュートリアルに進みます。Continue with the advanced tutorials: