| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238 | [role="xpack"][testenv="basic"][[eql-function-ref]]== EQL function reference++++<titleabbrev>Function reference</titleabbrev>++++experimental::[]{es} supports the following EQL functions:* <<eql-fn-add>>* <<eql-fn-between>>* <<eql-fn-cidrmatch>>* <<eql-fn-concat>>* <<eql-fn-divide>>* <<eql-fn-endswith>>* <<eql-fn-indexof>>* <<eql-fn-length>>* <<eql-fn-match>>* <<eql-fn-modulo>>* <<eql-fn-multiply>>* <<eql-fn-number>>* <<eql-fn-startswith>>* <<eql-fn-string>>* <<eql-fn-stringcontains>>* <<eql-fn-substring>>* <<eql-fn-subtract>>* <<eql-fn-wildcard>>[discrete][[eql-fn-add]]=== `add`Returns the sum of two provided addends.[%collapsible]====*Example*[source,eql]----add(4, 5)                                           // returns 9add(4, 0.5)                                         // returns 4.5add(0.5, 0.25)                                      // returns 0.75add(4, -2)                                          // returns 2add(-2, -2)                                         // returns -4// process.args_count = 4add(process.args_count, 5)                          // returns 9add(process.args_count, 0.5)                        // returns 4.5// process.parent.args_count = 2add(process.args_count, process.parent.args_count)  // returns 6// null handlingadd(null, 4)                                        // returns nulladd(4. null)                                        // returns nulladd(null, process.args_count)                       // returns nulladd(process.args_count null)                        // returns null----*Syntax*[source,txt]----add(<addend>, <addend>)----*Parameters:*`<addend>`::(Required, integer or float or `null`)Addend to add. If `null`, the function returns `null`.+Two addends are required. No more than two addends can be provided.+If using a field as the argument, this parameter supports only<<number,`numeric`>> field data types.*Returns:* integer, float, or `null`====[discrete][[eql-fn-between]]=== `between`Extracts a substring that's between a provided `left` and `right` text in asource string.[%collapsible]====*Example*[source,eql]----// file.path = "C:\\Windows\\System32\\cmd.exe"between(file.path, "system32\\\\", ".exe")                // returns "cmd"between(file.path, "workspace\\\\", ".exe")               // returns ""// Greedy matching defaults to false.between(file.path, "\\\\", "\\\\", false)                 // returns "Windows"// Sets greedy matching to truebetween(file.path, "\\\\", "\\\\", true)                  // returns "Windows\\System32"// Case sensitivity defaults to false.between(file.path, "system32\\\\", ".exe", false, false)  // returns "cmd"// Sets case sensitivity to truebetween(file.path, "system32\\\\", ".exe", false, true)   // returns ""between(file.path, "System32\\\\", ".exe", false, true)   // returns "cmd"// empty source stringbetween("", "system32\\\\", ".exe")                       // returns ""between("", "", "")                                       // returns ""// null handlingbetween(null, "system32\\\\", ".exe")                     // returns null----*Syntax*[source,txt]----between(<source>, <left>, <right>[, <greedy_matching>, <case_sensitive>])----*Parameters*`<source>`::+--(Required, string or `null`)Source string. Empty strings return an empty string (`""`), regardless of the`<left>` or `<right>` parameters. If `null`, the function returns `null`.If using a field as the argument, this parameter supports only the followingfield data types:* <<keyword,`keyword`>>* <<constant-keyword,`constant_keyword`>>* <<text,`text`>> field with a <<keyword,`keyword`>> or  <<constant-keyword,`constant_keyword`>> sub-field--`<left>`::+--(Required, string)Text to the left of the substring to extract. This text should includewhitespace.If using a field as the argument, this parameter supports only the followingfield data types:* <<keyword,`keyword`>>* <<constant-keyword,`constant_keyword`>>* <<text,`text`>> field with a <<keyword,`keyword`>> or  <<constant-keyword,`constant_keyword`>> sub-field--`<right>`::+--(Required, string)Text to the right of the substring to extract. This text should includewhitespace.If using a field as the argument, this parameter supports only the followingfield data types:* <<keyword,`keyword`>>* <<constant-keyword,`constant_keyword`>>* <<text,`text`>> field with a <<keyword,`keyword`>> or  <<constant-keyword,`constant_keyword`>> sub-field--`<greedy_matching>`::(Optional, boolean)If `true`, match the longest possible substring, similar to `.*` in regularexpressions. If `false`, match the shortest possible substring, similar to `.*?`in regular expressions. Defaults to `false`.`<case_sensitive>`::(Optional, boolean)If `true`, matching is case-sensitive. Defaults to `false`.*Returns:* string or `null`====[discrete][[eql-fn-cidrmatch]]=== `cidrMatch`Returns `true` if an IP address is contained in one or more provided{wikipedia}/Classless_Inter-Domain_Routing[CIDR] blocks.[%collapsible]====*Example*[source,eql]----// source.address = "192.168.152.12"cidrMatch(source.address, "192.168.0.0/16")               // returns truecidrMatch(source.address, "192.168.0.0/16", "10.0.0.0/8") // returns truecidrMatch(source.address, "10.0.0.0/8")                   // returns falsecidrMatch(source.address, "10.0.0.0/8", "10.128.0.0/9")   // returns false// null handlingcidrMatch(null, "10.0.0.0/8")                             // returns nullcidrMatch(source.address, null)                           // returns null----*Syntax*[source,txt]----`cidrMatch(<ip_address>, <cidr_block>[, ...])`----*Parameters*`<ip_address>`::(Required, string or `null`)IP address. Supports{wikipedia}/IPv4[IPv4] and{wikipedia}/IPv6[IPv6] addresses. If `null`, the functionreturns `null`.+If using a field as the argument, this parameter supports only the <<ip,`ip`>>field data type.`<cidr_block>`::(Required{multi-arg}, string or `null`)CIDR block you wish to search. If `null`, the function returns `null`.*Returns:* boolean or `null`====[discrete][[eql-fn-concat]]=== `concat`Returns a concatenated string of provided values.[%collapsible]====*Example*[source,eql]----concat("process is ", "regsvr32.exe")         // returns "process is regsvr32.exe"concat("regsvr32.exe", " ", 42)               // returns "regsvr32.exe 42"concat("regsvr32.exe", " ", 42.5)             // returns "regsvr32.exe 42.5"concat("regsvr32.exe", " ", true)             // returns "regsvr32.exe true"concat("regsvr32.exe")                        // returns "regsvr32.exe"// process.name = "regsvr32.exe"concat(process.name, " ", 42)                 // returns "regsvr32.exe 42"concat(process.name, " ", 42.5)               // returns "regsvr32.exe 42.5"concat("process is ", process.name)           // returns "process is regsvr32.exe"concat(process.name, " ", true)               // returns "regsvr32.exe true"concat(process.name)                          // returns "regsvr32.exe"// process.arg_count = 4concat(process.name, " ", process.arg_count)  // returns "regsvr32.exe 4"// null handlingconcat(null, "regsvr32.exe")                  // returns nullconcat(process.name, null)                    // returns nullconcat(null)                                  // returns null ----*Syntax*[source,txt]----concat(<value>[, <value>])----*Parameters*`<value>`::(Required{multi-arg-ref})Value to concatenate. If any of the arguments are `null`, the function returns `null`.+If using a field as the argument, this parameter does not support the<<text,`text`>> field data type.*Returns:* string or `null`====[discrete][[eql-fn-divide]]==== `divide`Returns the quotient of a provided dividend and divisor.[%collapsible]====[[eql-divide-fn-float-rounding]][WARNING]=====If both the dividend and divisor are integers, the `divide` function _roundsdown_ any returned floating point numbers to the nearest integer.EQL queries in {es} should account for this rounding. To avoid rounding, converteither the dividend or divisor to a float.[%collapsible].**Example**======The `process.args_count` field is a <<number,`long`>> integer field containing acount of process arguments.A user might expect the following EQL query to only match events with a`process.args_count` value of `4`.[source,eql]----process where divide(4, process.args_count) == 1----However, the EQL query matches events with a `process.args_count` value of `3`or `4`.For events with a `process.args_count` value of `3`, the `divide` functionreturns a floating point number of `1.333...`, which is rounded down to `1`.To match only events with a `process.args_count` value of `4`, converteither the dividend or divisor to a float.The following EQL query changes the integer `4` to the equivalent float `4.0`.[source,eql]----process where divide(4.0, process.args_count) == 1----===========*Example*[source,eql]----divide(4, 2)                                            // returns 2divide(4, 3)                                            // returns 1divide(4, 3.0)                                          // returns 1.333...divide(4, 0.5)                                          // returns 8divide(0.5, 4)                                          // returns 0.125divide(0.5, 0.25)                                       // returns 2.0divide(4, -2)                                           // returns -2divide(-4, -2)                                          // returns 2// process.args_count = 4divide(process.args_count, 2)                           // returns 2divide(process.args_count, 3)                           // returns 1divide(process.args_count, 3.0)                         // returns 1.333...divide(12, process.args_count)                          // returns 3divide(process.args_count, 0.5)                         // returns 8divide(0.5, process.args_count)                         // returns 0.125// process.parent.args_count = 2divide(process.args_count, process.parent.args_count)   // returns 2// null handlingdivide(null, 4)                                         // returns nulldivide(4, null)                                         // returns nulldivide(null, process.args_count)                        // returns nulldivide(process.args_count, null)                        // returns null----*Syntax*[source,txt]----divide(<dividend>, <divisor>)----*Parameters*`<dividend>`::(Required, integer or float or `null`)Dividend to divide. If `null`, the function returns `null`.+If using a field as the argument, this parameter supports only<<number,`numeric`>> field data types.`<divisor>`::(Required, integer or float or `null`)Divisor to divide by. If `null`, the function returns `null`. This value cannotbe zero (`0`).+If using a field as the argument, this parameter supports only<<number,`numeric`>> field data types.*Returns:* integer, float, or null====[discrete][[eql-fn-endswith]]=== `endsWith`Returns `true` if a source string ends with a provided substring.[%collapsible]====*Example*[source,eql]----endsWith("regsvr32.exe", ".exe")          // returns trueendsWith("regsvr32.exe", ".dll")          // returns falseendsWith("", "")                          // returns true// file.name = "regsvr32.exe"endsWith(file.name, ".exe")               // returns trueendsWith(file.name, ".dll")               // returns false// file.extension = ".exe"endsWith("regsvr32.exe", file.extension)  // returns trueendsWith("ntdll.dll", file.name)          // returns false// null handlingendsWith("regsvr32.exe", null)            // returns nullendsWith("", null)                        // returns nullendsWith(null, ".exe")                    // returns nullendsWith(null, null)                      // returns null----*Syntax*[source,txt]----endsWith(<source>, <substring>)----*Parameters*`<source>`::+--(Required, string or `null`)Source string. If `null`, the function returns `null`.If using a field as the argument, this parameter supports only the followingfield data types:* <<keyword,`keyword`>>* <<constant-keyword,`constant_keyword`>>* <<text,`text`>> field with a <<keyword,`keyword`>> or  <<constant-keyword,`constant_keyword`>> sub-field--`<substring>`::+--(Required, string or `null`)Substring to search for. If `null`, the function returns `null`.If using a field as the argument, this parameter supports only the followingfield data types:* <<keyword,`keyword`>>* <<constant-keyword,`constant_keyword`>>* <<text,`text`>> field with a <<keyword,`keyword`>> or  <<constant-keyword,`constant_keyword`>> sub-field--*Returns:* boolean or `null`====[discrete][[eql-fn-indexof]]=== `indexOf`Returns the first position of a provided substring in a source string.If an optional start position is provided, this function returns the firstoccurrence of the substring at or after the start position.[%collapsible]====*Example*[source,eql]----// url.domain = "subdomain.example.com"indexOf(url.domain, ".")        // returns 9indexOf(url.domain, ".", 9)     // returns 9indexOf(url.domain, ".", 10)    // returns 17indexOf(url.domain, ".", -6)    // returns 9// empty stringsindexOf("", "")                 // returns 0indexOf(url.domain, "")         // returns 0indexOf(url.domain, "", 9)      // returns 9indexOf(url.domain, "", 10)     // returns 10indexOf(url.domain, "", -6)     // returns 0// missing substringsindexOf(url.domain, "z")        // returns nullindexOf(url.domain, "z", 9)     // returns null// start position is higher than string lengthindexOf(url.domain, ".", 30)    // returns null// null handlingindexOf(null, ".", 9)           // returns nullindexOf(url.domain, null, 9)    // returns nullindexOf(url.domain, ".", null)  // returns null----*Syntax*[source,txt]----indexOf(<source>, <substring>[, <start_pos>])----*Parameters*`<source>`::+--(Required, string or `null`)Source string. If `null`, the function returns `null`.If using a field as the argument, this parameter supports only the followingfield data types:* <<keyword,`keyword`>>* <<constant-keyword,`constant_keyword`>>* <<text,`text`>> field with a <<keyword,`keyword`>> or  <<constant-keyword,`constant_keyword`>> sub-field--`<substring>`::+--(Required, string or `null`)Substring to search for.If this argument is `null` or the `<source>` string does not contain thissubstring, the function returns `null`.If the `<start_pos>` is positive, empty strings (`""`) return the `<start_pos>`.Otherwise, empty strings return `0`.If using a field as the argument, this parameter supports only the followingfield data types:* <<keyword,`keyword`>>* <<constant-keyword,`constant_keyword`>>* <<text,`text`>> field with a <<keyword,`keyword`>> or  <<constant-keyword,`constant_keyword`>> sub-field--`<start_pos>`::+--(Optional, integer or `null`)Starting position for matching. The function will not return positions beforethis one. Defaults to `0`.Positions are zero-indexed. Negative offsets are treated as `0`.If this argument is `null` or higher than the length of the `<source>` string,the function returns `null`.If using a field as the argument, this parameter supports only the following<<number,numeric>> field data types:* `long`* `integer`* `short`* `byte`--*Returns:* integer or `null`====[discrete][[eql-fn-length]]=== `length`Returns the character length of a provided string, including whitespace andpunctuation.[%collapsible]====*Example*[source,eql]----length("explorer.exe")         // returns 12length("start explorer.exe")   // returns 18length("")                     // returns 0length(null)                   // returns null// process.name = "regsvr32.exe"length(process.name)           // returns 12----*Syntax*[source,txt]----length(<string>)----*Parameters*`<string>`::+--(Required, string or `null`)String for which to return the character length. If `null`, the function returns`null`. Empty strings return `0`.If using a field as the argument, this parameter supports only the followingfield data types:* <<keyword,`keyword`>>* <<constant-keyword,`constant_keyword`>>* <<text,`text`>> field with a <<keyword,`keyword`>> or  <<constant-keyword,`constant_keyword`>> sub-field--*Returns:* integer or `null`====[discrete][[eql-fn-match]]=== `match`Returns `true` if a source string matches one or more provided regularexpressions.[%collapsible]====*Example*[source,eql]----match("explorer.exe", "[a-z]*?.exe")           // returns truematch("explorer.exe", "[a-z]*?.exe", "[1-9]")  // returns truematch("explorer.exe", "[1-9]")                 // returns falsematch("explorer.exe", "")                      // returns false// process.name = "explorer.exe"match(process.name, "[a-z]*?.exe")             // returns truematch(process.name, "[a-z]*?.exe", "[1-9]")    // returns truematch(process.name, "[1-9]")                   // returns falsematch(process.name, "")                        // returns false// null handlingmatch(null, "[a-z]*?.exe")                     // returns null----*Syntax*[source,txt]----match(<source>, <reg_exp>[, ...])----*Parameters*`<source>`::+--(Required, string or `null`)Source string. If `null`, the function returns `null`.If using a field as the argument, this parameter supports only the followingfield data types:* <<keyword,`keyword`>>* <<constant-keyword,`constant_keyword`>>* <<text,`text`>> field with a <<keyword,`keyword`>> or  <<constant-keyword,`constant_keyword`>> sub-field--`<reg_exp>`::+--(Required{multi-arg-ref}, string)Regular expression used to match the source string. For supported syntax, see<<regexp-syntax>>.https://docs.oracle.com/javase/tutorial/essential/regex/pre_char_classes.html[Predefinedcharacter classes] are not supported.Fields are not supported as arguments.--*Returns:* boolean or `null`====[discrete][[eql-fn-modulo]]=== `modulo`Returns the remainder of the division of a provided dividend and divisor.[%collapsible]====*Example*[source,eql]----modulo(10, 6)                                       // returns 4modulo(10, 5)                                       // returns 0modulo(10, 0.5)                                     // returns 0modulo(10, -6)                                      // returns 4modulo(-10, -6)                                     // returns -4// process.args_count = 10modulo(process.args_count, 6)                       // returns 4modulo(process.args_count, 5)                       // returns 0modulo(106, process.args_count)                     // returns 6modulo(process.args_count, -6)                      // returns 4modulo(process.args_count, 0.5)                     // returns 0// process.parent.args_count = 6add(process.args_count, process.parent.args_count)  // returns 4// null handlingmodulo(null, 5)                                     // returns nullmodulo(7, null)                                     // returns nullmodulo(null, process.args_count)                    // returns nullmodulo(process.args_count, null)                    // returns null----*Syntax*[source,txt]----modulo(<dividend>, <divisor>)----*Parameters*`<dividend>`::(Required, integer or float or `null`)Dividend to divide. If `null`, the function returns `null`. Floating pointnumbers return `0`.+If using a field as the argument, this parameter supports only<<number,`numeric`>> field data types.`<divisor>`::(Required, integer or float or `null`)Divisor to divide by. If `null`, the function returns `null`. Floating pointnumbers return `0`. This value cannot be zero (`0`).+If using a field as the argument, this parameter supports only<<number,`numeric`>> field data types.*Returns:* integer, float, or `null`====[discrete][[eql-fn-multiply]]=== `multiply`Returns the product of two provided factors.[%collapsible]====*Example*[source,eql]----multiply(2, 2)                                           // returns 4multiply(0.5, 2)                                         // returns 1multiply(0.25, 2)                                        // returns 0.5multiply(-2, 2)                                          // returns -4multiply(-2, -2)                                         // returns 4// process.args_count = 2multiply(process.args_count, 2)                          // returns 4multiply(0.5, process.args_count)                        // returns 1multiply(0.25, process.args_count)                       // returns 0.5// process.parent.args_count = 3multiply(process.args_count, process.parent.args_count)  // returns 6// null handlingmultiply(null, 2)                                        // returns nullmultiply(2, null)                                        // returns null----*Syntax*[source,txt]----multiply(<factor, <factor>)----*Parameters*`<factor>`::+--(Required, integer or float or `null`)Factor to multiply.  If `null`, the function returns `null`.Two factors are required. No more than two factors can be provided.If using a field as the argument, this parameter supports only<<number,`numeric`>> field data types.--*Returns:* integer, float, or `null`====[discrete][[eql-fn-number]]=== `number`Converts a string to the corresponding integer or float.[%collapsible]====*Example*[source,eql]----number("1337")              // returns 1337number("42.5")              // returns 42.5number("deadbeef", 16)      // returns 3735928559// integer literals beginning with "0x" are auto-detected as hexadecimalnumber("0xdeadbeef")        // returns 3735928559number("0xdeadbeef", 16)    // returns 3735928559// "+" and "-" are supportednumber("+1337")             // returns 1337number("-1337")             // returns -1337// surrounding whitespace is ignorednumber("  1337  ")          // returns 1337// process.pid = "1337"number(process.pid)         // returns 1337// null handlingnumber(null)                // returns nullnumber(null, 16)            // returns null// strings beginning with "0x" are treated as hexadecimal (base 16),// even if the <base_num> is explicitly null.number("0xdeadbeef", null) // returns 3735928559// otherwise, strings are treated as decimal (base 10)// if the <base_num> is explicitly null.number("1337", null)        // returns 1337----*Syntax*[source,txt]----number(<string>[, <base_num>])----*Parameters*`<string>`::+--(Required, string or `null`)String to convert to an integer or float. If this value is a string, it must beone of the following:* A string representation of an integer (e.g., `"42"`)* A string representation of a float (e.g., `"9.5"`)* If the `<base_num>` parameter is specified, a string containing an integer  literal in the base notation (e.g., `"0xDECAFBAD"` in hexadecimal or base  `16`)Strings that begin with `0x` are auto-detected as hexadecimal and use a default`<base_num>` of `16`.`-` and `+` are supported with no space between. Surrounding whitespace isignored. Empty strings (`""`) are not supported.If using a field as the argument, this parameter supports only the followingfield data types:* <<keyword,`keyword`>>* <<constant-keyword,`constant_keyword`>>* <<text,`text`>> field with a <<keyword,`keyword`>> or  <<constant-keyword,`constant_keyword`>> sub-fieldIf this argument is `null`, the function returns `null`.--`<base_num>`::+--(Optional, integer or `null`)Radix or base used to convert the string. If the `<string>` begins with `0x`,this parameter defaults to `16` (hexadecimal). Otherwise, it defaults to base`10`.If this argument is explicitly `null`, the default value is used.Fields are not supported as arguments.--*Returns:* integer or float or `null`====[discrete][[eql-fn-startswith]]=== `startsWith`Returns `true` if a source string begins with a provided substring.[%collapsible]====*Example*[source,eql]----startsWith("regsvr32.exe", "regsvr32")  // returns truestartsWith("regsvr32.exe", "explorer")  // returns falsestartsWith("", "")                      // returns true// process.name = "regsvr32.exe"startsWith(process.name, "regsvr32")    // returns truestartsWith(process.name, "explorer")    // returns false// process.name = "regsvr32"startsWith("regsvr32.exe", process.name) // returns truestartsWith("explorer.exe", process.name) // returns false// null handlingstartsWith("regsvr32.exe", null)        // returns nullstartsWith("", null)                    // returns nullstartsWith(null, "regsvr32")            // returns nullstartsWith(null, null)                  // returns null----*Syntax*[source,txt]----startsWith(<source>, <substring>)----*Parameters*`<source>`::+--(Required, string or `null`)Source string. If `null`, the function returns `null`.If using a field as the argument, this parameter supports only the followingfield data types:* <<keyword,`keyword`>>* <<constant-keyword,`constant_keyword`>>* <<text,`text`>> field with a <<keyword,`keyword`>> or  <<constant-keyword,`constant_keyword`>> sub-field--`<substring>`::+--(Required, string or `null`)Substring to search for. If `null`, the function returns `null`.If using a field as the argument, this parameter supports only the followingfield data types:* <<keyword,`keyword`>>* <<constant-keyword,`constant_keyword`>>* <<text,`text`>> field with a <<keyword,`keyword`>> or  <<constant-keyword,`constant_keyword`>> sub-field--*Returns:* boolean or `null`====[discrete][[eql-fn-string]]=== `string`Converts a value to a string.[%collapsible]====*Example*[source,eql]----string(42)               // returns "42"string(42.5)             // returns "42.5"string("regsvr32.exe")   // returns "regsvr32.exe"string(true)             // returns "true"// null handlingstring(null)             // returns null----*Syntax*[source,txt]----string(<value>)----*Parameters*`<value>`::(Required)Value to convert to a string. If `null`, the function returns `null`.+If using a field as the argument, this parameter does not support the<<text,`text`>> field data type.*Returns:* string or `null`====[discrete][[eql-fn-stringcontains]]=== `stringContains`Returns `true` if a source string contains a provided substring.[%collapsible]====*Example*[source,eql]----// process.command_line = "start regsvr32.exe"stringContains(process.command_line, "regsvr32")  // returns truestringContains(process.command_line, "start ")    // returns truestringContains(process.command_line, "explorer")  // returns false// process.name = "regsvr32.exe"stringContains(command_line, process.name)        // returns true// empty stringsstringContains("", "")                            // returns falsestringContains(process.command_line, "")          // returns false// null handlingstringContains(null, "regsvr32")                  // returns nullstringContains(process.command_line, null)        // returns null----*Syntax*[source,txt]----stringContains(<source>, <substring>)----*Parameters*`<source>`::(Required, string or `null`)Source string to search. If `null`, the function returns `null`.If using a field as the argument, this parameter supports only the followingfield data types:* <<keyword,`keyword`>>* <<constant-keyword,`constant_keyword`>>* <<text,`text`>> field with a <<keyword,`keyword`>> or  <<constant-keyword,`constant_keyword`>> sub-field`<substring>`::(Required, string or `null`)Substring to search for. If `null`, the function returns `null`.If using a field as the argument, this parameter supports only the followingfield data types:* <<keyword,`keyword`>>* <<constant-keyword,`constant_keyword`>>* <<text,`text`>> field with a <<keyword,`keyword`>> or  <<constant-keyword,`constant_keyword`>> sub-field*Returns:* boolean or `null`====[discrete][[eql-fn-substring]]=== `substring`Extracts a substring from a source string at provided start and end positions.If no end position is provided, the function extracts the remaining string.[%collapsible]====*Example*[source,eql]----substring("start regsvr32.exe", 6)        // returns "regsvr32.exe"substring("start regsvr32.exe", 0, 5)     // returns "start"substring("start regsvr32.exe", 6, 14)    // returns "regsvr32"substring("start regsvr32.exe", -4)       // returns ".exe"substring("start regsvr32.exe", -4, -1)   // returns ".ex"----*Syntax*[source,txt]----substring(<source>, <start_pos>[, <end_pos>])----*Parameters*`<source>`::(Required, string)Source string.`<start_pos>`::+--(Required, integer)Starting position for extraction.If this position is higher than the `<end_pos>` position or the length of the`<source>` string, the function returns an empty string.Positions are zero-indexed. Negative offsets are supported.--`<end_pos>`::(Optional, integer)Exclusive end position for extraction. If this position is not provided, thefunction returns the remaining string.+Positions are zero-indexed. Negative offsets are supported.*Returns:* string====[discrete][[eql-fn-subtract]]=== `subtract`Returns the difference between a provided minuend and subtrahend.[%collapsible]====*Example*[source,eql]----subtract(10, 2)                                          // returns 8subtract(10.5, 0.5)                                      // returns 10subtract(1, 0.2)                                         // returns 0.8subtract(-2, 4)                                          // returns -8subtract(-2, -4)                                         // returns 8// process.args_count = 10subtract(process.args_count, 6)                          // returns 4subtract(process.args_count, 5)                          // returns 5subtract(15, process.args_count)                         // returns 5subtract(process.args_count, 0.5)                        // returns 9.5// process.parent.args_count = 6subtract(process.args_count, process.parent.args_count)  // returns 4// null handlingsubtract(null, 2)                                        // returns nullsubtract(2, null)                                        // returns null----*Syntax*[source,txt]----subtract(<minuend>, <subtrahend>)----*Parameters*`<minuend>`::(Required, integer or float or `null`)Minuend to subtract from.+If using a field as the argument, this parameter supports only<<number,`numeric`>> field data types.`<subtrahend>`::(Optional, integer or float or `null`)Subtrahend to subtract. If `null`, the function returns `null`.+If using a field as the argument, this parameter supports only<<number,`numeric`>> field data types.*Returns:* integer, float, or `null`====[discrete][[eql-fn-wildcard]]=== `wildcard`Returns `true` if a source string matches one or more provided wildcardexpressions.[%collapsible]====*Example*[source,eql]----// The two following expressions are equivalent.process.name == "*regsvr32*" or process.name == "*explorer*"wildcard(process.name, "*regsvr32*", "*explorer*")// process.name = "regsvr32.exe"wildcard(process.name, "*regsvr32*")                // returns truewildcard(process.name, "*regsvr32*", "*explorer*")  // returns truewildcard(process.name, "*explorer*")                // returns falsewildcard(process.name, "*explorer*", "*scrobj*")    // returns false// empty stringswildcard("", "*start*")                             // returns falsewildcard("", "*")                                   // returns truewildcard("", "")                                    // returns true// null handlingwildcard(null, "*regsvr32*")                        // returns nullwildcard(process.name, null)                        // returns null----*Syntax*[source,txt]----wildcard(<source>, <wildcard_exp>[, ...])----*Parameters*`<source>`::+--(Required, string)Source string. If `null`, the function returns `null`.If using a field as the argument, this parameter supports only the followingfield data types:* <<keyword,`keyword`>>* <<constant-keyword,`constant_keyword`>>* <<text,`text`>> field with a <<keyword,`keyword`>> or  <<constant-keyword,`constant_keyword`>> sub-field--`<wildcard_exp>`::+--(Required{multi-arg-ref}, string)Wildcard expression used to match the source string. If `null`, the functionreturns `null`. Fields are not supported as arguments.--*Returns:* boolean====
 |