Splunk SPL 命令覆盖清单
Osmanthe 开发预览版 · 2026-10-11 · 返回文档目录 · SPL 使用说明
一句话回答:没有全部支持,也不打算全部照搬。
Splunk 搜索语言有一百多个命令,其中三分之一左右是 Splunk 自己的数据模型、集群、指标库、摘要索引用的,搬到别的产品上没有意义。这一页把 Splunk 官方命令表逐个过了一遍,每个命令标明现在的状态,以后不用一个个问。
15已支持
21部分支持
19计划·优先
25计划·之后
10不打算做
共 90 个条目(意思相近的命令合在一行,例如 append / appendcols / appendpipe)。
状态是什么意思
- 已支持 常见写法结果和 Splunk 一致。
- 部分支持 常用写法能用,个别选项不支持。用到不支持的选项会直接报错并说明原因,不会悄悄给出不同的结果。
- 计划·优先 日常使用多,下一批就做。
- 计划·之后 用得少,排在后面;哪个急用告诉我就提前。
- 不打算做 依赖 Splunk 自己的内部体系,在 Osmanthe 里没有对应的东西,会用我们自己的功能代替(例如保存搜索、告警)。
输入不支持的命令时,报错信息会说明是“还没做”还是“不打算做”,以及能用什么代替。
逐个命令
搜索与过滤
| 命令 | 状态 | 说明 |
|---|---|---|
search | 已支持 | 关键词、短语、field=value、比较、通配符、AND/OR/NOT、IN;字段名有空格等特殊字符时写成 'my field'=value 或 "my field"=value(单引号里的 ' 写成 \';名字里的 |、[ ]、全角符号原样保留);中文引号 “” 在引号外等同英文双引号,在引号里的会原样保留;earliest/latest 支持 -7d、-1d@d、@w1、-1mon@mon 等取整写法;| search 对多值字段逐个值匹配:a=x、通配符和 IN 是任一值匹配,NOT a=x 是没有值匹配,a!=x 是至少一个值不是 x;多值字段的大小比较会报错,需先 mvexpand |
where | 部分支持 | 比较和 AND/OR/NOT;函数支持 isnull、isnotnull、like、match、searchmatch、cidrmatch;where、eval 和 stats/chart/timechart 的 count(eval(...)) 里的 searchmatch 对多值字段和 | search 一样逐个值匹配;多值字段的 = 只要有一个值相等就成立,!= 只要有一个值不同就成立(区分大小写),大小比较以及和另一个字段比较(如 where tags=wanted)会报错,需先 mvexpand |
regex | 已支持 | regex 字段="正则"、字段!="正则";和 Splunk 一样区分大小写 |
dedup | 部分支持 | 每个值保留最新 N 条;不支持 sortby,不能用在 stats 之后 |
head | 部分支持 | head N / limit=N;不支持 head (条件) |
tail | 部分支持 | 原始事件可用;stats 之后不支持 |
reverse | 部分支持 | 原始事件可用(改成从旧到新);stats 之后不支持 |
sort | 已支持 | 多字段、+/-、num()/str()、sort N;和 Splunk 一样,不写数量时只保留前 10000 行,sort 0 或 limit=0 保留全部 |
uniq | 计划·之后 |
统计
| 命令 | 状态 | 说明 |
|---|---|---|
stats | 部分支持 | count、count(eval(条件))、dc、sum、avg、min、max、median、stdev、percN/pN、values(按文字逐字节排序,a1、a10、a2,和 Splunk 一致)、list(按当前行顺序取前 100 个值,原始事件从新到旧)、earliest/latest(_time)、first/last(_time)(按当前顺序,不按 _time 排时报错);还没有 range、var、mode、earliest(任意字段)、sum(eval(...)) |
tstats | 部分支持 | 写法和 Splunk 相同,任何字段都能用;不支持 from datamodel= |
eventstats | 部分支持 | 把统计结果加到每一行;只支持 count、sum、avg、min、max 和 earliest/latest/first/last(_time),其他统计函数会报错;allnum 等选项忽略 |
streamstats | 部分支持 | 累计统计,按当前顺序算(原始事件默认从新到旧,sort 之后按排好的顺序),和 Splunk 一致;统计函数和 eventstats 一样;不支持 window=、reset_* |
timechart | 已支持 | span、by、usenull;limit(默认 10,0 为不限)、useother、otherstr:按各系列数值总和保留前 N 个,其余按时间合成 OTHER(count、sum 相加,min、max 取最小最大,avg 按事件重新平均;dc、median、values 等无法合并,需加 useother=f 或 limit=0,否则报错);不写 span 自动选;cont=false 时图表不补空的时间段;partial=f、bins、fixedrange、limit=top5 写法会报错 |
chart | 已支持 | over ... by ...;limit、useother、otherstr 同 timechart;span 对 over 字段分桶(数字分成 0-5、5-10 这样的区间,_time 按时间分桶) |
top | 已支持 | limit、countfield、by;多值字段按每个值分别计数,百分比按事件数计算;图表按 by 字段分系列,分组列超过两个时默认显示表格 |
rare | 已支持 | 同 top |
eventcount | 部分支持 | | eventcount index=x 返回总条数;不支持 summarize=false |
metadata | 部分支持 | type=hosts / sources / sourcetypes;firstTime、lastTime、recentTime 是 epoch 秒(recentTime 取最新事件时间,不是写入时间) |
addtotals | 部分支持 | 按行求和,需写出字段名;不支持 col=t 和通配符 |
accum | 部分支持 | 累计求和,按当前顺序 |
addcoltotals | 计划·优先 | |
delta | 计划·优先 | |
autoregress | 计划·之后 | |
trendline | 计划·之后 | |
concurrency | 计划·之后 | |
contingency | 计划·之后 | |
timewrap | 计划·优先 |
字段与转换
| 命令 | 状态 | 说明 |
|---|---|---|
bin / bucket | 部分支持 | 只支持 _time span= |
eval | 部分支持 | if、case、coalesce、len、lower、upper、round、abs、floor、ceil、exp、ln、min、max、tostring、tonumber、replace、substr、trim/ltrim/rtrim、split、now、time、四则运算、字符串拼接;还没有 strftime/strptime、mv* 系列、json_* 系列、md5 等 |
rex | 已支持 | 命名分组提取,field=;mode=sed 支持 s/正则/替换/g;每条事件只取第一处匹配,写 max_match(除 1 外)或 offset_field 会报错;提取到多值字段时存成单个值,没匹配上的事件保留原来的多值(普通字段没匹配上时会被清空,和 Splunk 不同) |
extract (kv) | 部分支持 | 默认 key=value 自动提取;不支持自定义分隔符 |
spath | 部分支持 | 展开整个 JSON(spath、spath input=字段);不支持 path=;覆盖多值字段时,JSON 数组仍是多值,其他值按单个值处理;JSON 里内容像数组的字符串按单个值处理(显示为 ["[1,2]"] 这样的单值数组);JSON 没有覆盖的 eval 等得到的单个值保持不变,只有内容像 JSON 数组时会改存成单值数组;嵌套键(如 x.a)里像数组的字符串仍会被当成数组 |
fillnull | 部分支持 | 需要写出字段名;对多值字段填入的值按单个值处理(不会把 "[z]" 这样的文字当成数组) |
replace | 已支持 | 整值替换,支持 * 通配和多个 WITH |
rename | 部分支持 | 不支持通配符 |
table | 已支持 | |
fields | 已支持 | fields - 去掉字段 |
makemv | 部分支持 | delim=、allowempty(默认去掉空值);makemv、split() 和 stats 的 values()/list() 得到的多值字段,stats / chart / timechart 统计时逐个值计算(dc、values、count(字段) 等),其他统计每条事件仍只算一次;by 后面的多值字段按每个值各分一组;stats / chart / timechart 支持 dedup_splitvals=true 去掉同一事件内重复的分组值(默认 false,重复值仍重复计数),eval 复制多值字段(eval b=a)或 if / case / coalesce 返回多值字段时结果仍是多值,分支有的多值有的不是时,非多值的值按单个值的多值处理;lookup OUTPUTNEW 填入已经是多值的字段时同样按单个值的多值处理;lookup 多行匹配得到的多值也支持逐值统计、分组和 eval 复制;eventstats / streamstats 统计或 by 多值字段会报错;不支持 tokenizer=、setsv=true |
mvexpand | 已支持 | limit=;eval、rex、strcat 得到的单个值整体保留一行("[z]"、看起来像 JSON 数组的文字都不会被拆开);来源不明的字段(如日志原有字段)只有值是合法 JSON 数组时才拆开 |
strcat | 已支持 | allrequired=t 时只有所有源字段都存在才写入目标字段;目标字段原来是多值时,没写入的事件保留原多值,写入的值存成单值数组,字段仍按多值处理 |
rangemap | 已支持 | 区间有重叠时,range 是多值字段,包含所有匹配的标签(只匹配一个或用 default 时也是单元素数组);区间不重叠时仍是单值 |
convert | 计划·优先 | |
fieldformat | 计划·优先 | |
filldown | 计划·优先 | |
mvcombine | 计划·优先 | |
nomv | 计划·优先 | |
foreach | 计划·优先 | |
fromjson / tojson | 计划·优先 | |
xmlkv / xpath | 计划·之后 | |
multikv | 计划·之后 | |
erex | 计划·之后 | |
kvform | 不打算做 | 依赖 Splunk 的表单模板文件 |
xmlunescape | 计划·之后 | |
scrub | 计划·之后 | |
setfields | 计划·之后 | |
localize | 计划·之后 | |
reltime | 计划·之后 | |
makecontinuous | 计划·之后 | |
addinfo | 计划·之后 |
多搜索与关联
| 命令 | 状态 | 说明 |
|---|---|---|
transaction | 计划·优先 | 会话拼接;底层没有对应能力,计划在网关里实现,先用 stats min(_time) max(_time) values(...) by 会话字段 代替 |
join | 计划·优先 | 计划做(含 type=left/inner) |
append / appendcols / appendpipe | 计划·优先 | |
union / multisearch | 计划·优先 | |
子搜索 [ ... ]、return、format | 计划·优先 | |
map | 计划·之后 | |
selfjoin / set / diff | 计划·之后 |
查找表与生成数据
| 命令 | 状态 | 说明 |
|---|---|---|
lookup | 已支持 | CSV 查找表:多个匹配列、AS、OUTPUT / OUTPUTNEW,多行匹配得到多值(这样的列里只匹配到一个值的行也显示成单元素数组,如 ["z"],和 makemv 一致);查找表在「上传数据 → 查找表」里管理。Splunk 在 transforms.conf 里配的通配符 / CIDR 匹配、按时间查找、KV Store 和外部脚本查找没有 |
inputlookup / outputlookup | 部分支持 | inputlookup 支持 where、start=、max=、append=t(接到前面结果的后面);outputlookup 支持 append=t、override_if_empty=、create_empty=、max=,和 Splunk 一样后面可以接其它命令(结果原样往下传,后面的命令照常处理;一个查询里可以有多个 outputlookup,各自保存到它那一步的结果),每张表最多 50 万行。后面接了命令时,网关会先把到 outputlookup 为止的部分跑一遍保存,再跑整个查询返回结果,事件在两次之间有新增时两边可能略有出入。为防止分享链接改写查找表,含 outputlookup 的查询只在点「搜索」或按回车时执行(API 须用 POST /api/v1/search,GET 返回 405);从链接打开不会自动执行 |
inputcsv / outputcsv | 计划·之后 | |
makeresults | 计划·优先 | 底层不能凭空生成行,需在网关里实现 |
gentimes | 计划·之后 |
结果表变形
| 命令 | 状态 | 说明 |
|---|---|---|
xyseries / untable / transpose | 计划·优先 | 需要在网关里对结果表做二次计算 |
fieldsummary | 计划·优先 |
地理
| 命令 | 状态 | 说明 |
|---|---|---|
iplocation | 计划·优先 | 需要 IP 地理库 |
geostats / geom / geomfilter | 计划·之后 |
机器学习与高级统计
| 命令 | 状态 | 说明 |
|---|---|---|
predict / anomalydetection / outlier | 计划·之后 | 可以做成我们自己的异常检测,不一定照搬 |
cluster / kmeans | 计划·之后 | |
anomalies / anomalousvalue / analyzefields | 计划·之后 | |
arules / associate / cofilter / correlate / x11 | 计划·之后 |
界面显示
| 命令 | 状态 | 说明 |
|---|---|---|
highlight / abstract / iconify / gauge | 计划·之后 | 只影响 Splunk 界面显示 |
Splunk 专有体系
| 命令 | 状态 | 说明 |
|---|---|---|
datamodel / pivot / from | 不打算做 | Splunk 数据模型体系,Osmanthe 没有对应概念 |
tags / typer / typelearner / findtypes | 不打算做 | 依赖 Splunk 知识对象(标签、事件类型) |
loadjob / savedsearch | 不打算做 | 依赖 Splunk 的作业和保存搜索;以后做我们自己的保存搜索 |
collect / tscollect / summary indexing(sistats、sitop、sichart、sitimechart、sirare) | 不打算做 | Splunk 摘要索引机制 |
mstats / mcatalog / mpreview / msearch / mcollect / meventcollect | 不打算做 | Splunk 指标库,不在日志产品范围 |
rest / dbinspect / audit / history / metasearch / walklog | 不打算做 | 读 Splunk 服务器自身的内部信息 |
sendalert / sendemail / script (run) | 不打算做 | 以后用我们自己的告警功能代替 |
delete | 不打算做 | 删除数据走管理功能,不放在搜索语言里 |
localop / redistribute / require / rtorder / typeahead / overlap / inputintelligence | 不打算做 | Splunk 集群和内部调度用 |
这一批新增了什么(2026-10-11)
- 命令:eventstats、streamstats、regex、reverse、replace、makemv、mvexpand、extract / kv、strcat、addtotals、rangemap、accum、rex mode=sed,以及写在开头的 | metadata、| eventcount。
- 统计函数:count(eval(条件)),例如
| stats count(eval(status>=500)) as errors, count by host。 - eval 函数:replace、substr、trim / ltrim / rtrim、split、now、time。
- 时间取整:
earliest=-1d@d latest=@d(昨天一整天)、earliest=@w1(本周一起)、earliest=-1mon@mon等,按你手机的时区取整。 - 每个新命令都有单元测试,并在回归用例 004 里对着真实服务验证过。
和 Splunk 结果不同的地方
- eventstats ... by 字段:没有这个字段的事件,Splunk 不给结果字段;这里会按“空值”分一组算。
- extract:按 key=value、空格分隔提取,已有的字段不覆盖。