github.com/GuanceCloud/cliutils@v1.1.21/pipeline/README.md (about) 1 # 文本处理器 定义 2 3 以下是 文本处理器 定义。随着不同语法的逐步支持,该文档会做不同程度的调整和增删。 4 5 全局约束如下: 6 7 - 非关键字(如指标名、标签名等)大小写敏感,**关键字及函数名大小写不敏感** 8 9 - 以 `#` 为行注释字符,不支持行内注释 10 11 - 支持的操作符: 12 13 - `+` - 加法 14 - `-` - 减法 15 - `*` - 乘法 16 - `/` - 除法 17 - `%` - 取模 18 - `=` - 等于 19 - `!=` - 不等于 20 - `<=` - 大于等于 21 - `<` - 小于 22 - `>=` - 大于等于 23 - `>` - 大于 24 - `^` - 指数运算 25 - `&&` - 逻辑与 26 - `||` - 逻辑或 27 28 29 - 标识符:标识符有几种形式,便于兼容各种变量命名形式 30 31 - 正常变量名中只能出现 `[_a-zA-Z0-9]` 这些字符,且首字符不能是数字。如 `_abc, _abc123, _123ab` 32 - 其它形式的变量名处理方式: 33 - `this+is-a*xx/yy^zz?variable`,`by` 需写成 `` `this+is-a*xx/yy^zz?variable` ``,`` `by` ``,前者变量中带运算符,后者的 `by` 是 DQL 关键字 34 - `这是一个中文或其它非英文字符变量` 需写成 `` `这是一个中文或其它非英文字符变量` `` 35 - 变量中就带了一个反引号,`` this`is-a-vairalbe `` 需写成 `` `identifier("this`is-a-vairalbe")` `` 来修饰 36 37 - 字符串值可用双引号和单引号: `"this is a string"` 和 `'this is a string'` 是等价的 38 39 - 数据类型:支持浮点(`123.4`, `5.67E3`)、整形(`123`, `-1`)、字符串(`'张三'`, `"hello world"`)、Boolean(`true`, `false`)四种类型 40 41 42 ## sdk使用 43 44 用法: 45 - 加载函数处理脚本 46 ``` 47 // scriptName 为存放于 datakit 安装目录下的 pipeline 目录下的脚本的文件名 (xxx.p) 48 // 或由 gitrepos,remote 加载的脚本的脚本名 (xxx.p) 49 // pipeline script 由 pipeline 的 scriptstore 模块统一管理, 在 datakit 启动后将加载指定目录, 50 // 如 datakit 安装目录下的 pipeline, remote, gitrepos 下的 pipeline 脚本 51 p := NewPipeline(scriptName) 52 ``` 53 54 - 文本处理 55 ``` 56 // 支持 []byte string 两种数据类型 57 // Run() RunByte() 非线程安全 58 59 ret, err := p.Run("abc", source) 60 61 // encode 值可为 "gbk", "gb18030", "utf-8", 其他值均按 utf-8 编码处理 62 ret, err := p.RunByte([]byte("abc"), encode, source) 63 64 // ret 的数据结构为,建议通过 Result 结构体提供的一系列方法进行操作 65 /* 66 type Result struct { 67 Output *parser.Output 68 69 TS time.Time 70 71 Err string 72 } 73 */ 74 ``` 75 76 - 检测脚本变更并更新 Pipeline 实例 77 ``` 78 // 该函数可以通过 scriptstore 模块检测相应的脚本是否发生了更新,并更新该 Pipeline 实例 79 // 需要注意的是,该操作并非线程安全,即调用此函数时不可执行 Run 和 RunByte 方法。 80 err := p.UpdateScriptInfo() 81 ``` 82 83 ## 脚本函数 84 85 支持的处理函数 86 87 函数: grok([grok_parttern], [json_path]) 88 89 参数: 90 - `grok_parttern`: grok表达式 (必选参数) 91 - `json_path`: 待处理数据的json_path (选填参数) 92 93 说明: 将对应json_path的字符串执行Grok,并成为json_data子结构 94 95 示例: 96 ``` 97 json_data = `{"content": "127.0.0.1 - - [23/Apr/2014:22:58:32 +0200] "GET /index.php HTTP/1.1" 404 207", "app": "dev"}` 98 grok("%{COMMONAPACHELOG}", content); 99 ``` 100 101 函数: rename(json_path], [new_key]) 102 103 参数: 104 - `json_path`: 待改名的json_path (必选参数) 105 - `new_key`: 新的key name (必选参数) 106 107 说明: 将结构中的原有key改名为新的new_key, 并成为json_data子结构 108 109 示例: 110 ``` 111 json_data = `{"a":{"first":2.3,"second":2,"thrid":"abc","forth":true},"age":47}` 112 rename(a.second, bb); 113 ``` 114 115 函数: lowercase([json_path], [new_key]) 116 117 参数: 118 - `json_path`: 待处理数据的json_path (必选参数) 119 - `new_key`: 新的key name (必选参数) 120 121 说明: 将对应处理数据转化为小写,插入到new_key下, 并成为json_data子结构 122 123 示例: 124 ``` 125 json_data = `{"a":{"first":2.3,"second":2,"thrid":"ABC","forth":true},"age":47}` 126 lowercase(a.thrid, bb); 127 ``` 128 129 函数: uppercase([json_path], [new_key]) 130 131 参数: 132 - `json_path`: 待处理数据的json_path (必选参数) 133 - `new_key`: 新的key name (必选参数) 134 135 说明: 将对应处理数据转化为大写,插入到new_key下, 并成为json_data子结构 136 137 示例: 138 ``` 139 json_data = `{"a":{"first":2.3,"second":2,"thrid":"abc","forth":true},"age":47}` 140 uppercase(a.thrid, bb); 141 ``` 142 143 函数: nullif([json_path], [range]) 144 145 参数: 146 - `json_path`: 待处理数据的json_path (必选参数) 147 - `new_key`: 新的key name (必选参数) 148 149 说明: 将对应处理数据转化为大写,插入到new_key下, 并成为json_data子结构 150 151 示例: 152 ``` 153 json_data = `{"a":{"first":2.3,"second":2,"thrid":"abc","forth":true},"age":47}` 154 nullif(a.second, bb); 155 ``` 156 157 函数: user_agent([json_path], [new_key]) 158 159 参数: 160 - `json_path`: 待处理数据的json_path (必选参数) 161 - `new_key`: 新的key name (必选参数) 162 163 说明: 提取user-agent中的信息,插入到new_key下, 并成为json_data子结构 164 165 示例: 166 ``` 167 json_data = `{"userAgent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.2 (KHTML, like Gecko) Ubuntu/11.10 Chromium/15.0.874.106 Chrome/15.0.874.106 Safari/535.2"}` 168 user_agent(userAgent, user_agent); 169 ``` 170 171 函数: urldecode([json_path], [new_key]) 172 173 参数: 174 - `json_path`: 待处理数据的json_path (必选参数) 175 - `new_key`: 新的key name (必选参数) 176 177 说明: 将对应字符串执行urldecode,插入到new_key下, 并成为json_data子结构 178 179 示例: 180 ``` 181 json_data = `{"url":"http://www.example.org/default.html?ct=32&op=92&item=98"}` 182 urldecode(url, url_dic); 183 ``` 184 185 函数: geoip([json_path], [new_key]) 186 187 参数: 188 - `json_path`: 待处理数据的json_path (必选参数) 189 - `new_key`: 新的key name (必选参数) 190 191 说明: 将对应IP字符串获取响应地理信息,插入到new_key下, 并成为json_data子结构 192 193 示例: 194 ``` 195 json_data = `{"ip":"172.168.0.3"}` 196 geoip(ip, ip_addr); 197 ``` 198 199 函数: datetime([json_path], [datetime_parttern],[new_key]) 200 201 参数: 202 - `json_path`: 待处理数据的json_path (必选参数) 203 - `datetime_parttern`: 时间格式化字符串(格式化标准,待完善) (必选参数) 204 - `new_key`: 新的key name (必选参数) 205 206 说明: 将对应日期字段格式化为新的日期显示方式,插入到new_key下, 并成为json_data子结构 207 208 示例: 209 ``` 210 json_data = `{"date":"23/Apr/2014:22:58:32 +0200"}` 211 datetime(date, "yyyy-mm-dd HH:MM:SS"); 212 ``` 213 214 函数: expr([json_path], [expr], [new_key]) 215 216 参数: 217 - `json_path`: 待处理数据的json_path (必选参数) 218 - `expr`: 计算表达式 (必选参数) 219 - `new_key`: 新的key name (必选参数) 220 221 说明: 将对应字段进行计算后,插入到new_key下, 并成为json_data子结构 222 223 示例: 224 ``` 225 json_data = `{"a":{"first":2.3,"second":2,"thrid":"abc","forth":true},"age":47}` 226 expr(a.second*10+(2+3)*5, bb); 227 ``` 228 229 函数: stringf([new_key], [format_pattern], [json_path]....) 230 231 参数: 232 - `json_path`: 待处理数据的json_path (必选参数) 233 - `format_pattern`: 格式化字符串 (必选参数) 234 - `new_key`: 新的key name (必选参数) 235 236 说明: 通过printf格式自定义字符串 237 238 示例: 239 ``` 240 json_data = `{"a":{"first":2.3,"second":2,"thrid":"abc","forth":true},"age":47}` 241 stringf(bb, "%d %s %v", a.second, a.thrid, a.forth); 242 ``` 243 244 函数: cast([json_path], [type],[new_key]) 245 246 参数: 247 - `json_path`: 待处理数据的json_path (必选参数) 248 - `type`: 转化的类型, 以下枚举值int, bool, str, float (必选参数) 249 - `new_key`: 新的key name (必选参数) 250 251 说明: 将对应的字段进行类型转化,插入到new_key下, 并成为json_data子结构 252 253 示例: 254 ``` 255 json_data = `{"a":{"first":2.3,"second":2,"thrid":"abc","forth":true},"age":47}` 256 cast(bb, a.second, "float"); 257 ``` 258 259 函数: group([json_path], [range], [new_key]) 260 261 参数: 262 - `json_path`: 待处理数据的json_path (必选参数) 263 - `range`: 指定范围 (必选参数) 264 - `new_key`: 新的key name (必选参数) 265 266 说明: 将对应的字段进行按条件分组赋值 267 268 示例: 269 ``` 270 json_data = `{"age":10, "name": "张三"}` 271 group(age, [0-16], children); 272 ``` 273 274 275 函数: group_in([json_path], [set], [new_key]) 276 277 参数: 278 - `json_path`: 待处理数据的json_path (必选参数) 279 - `set`: 指定集合 (必选参数) 280 - `new_key`: 新的key name (必选参数) 281 282 说明: 将对应的字段进行按条件分组赋值 283 284 示例: 285 ``` 286 json_data = `{"age":10, "name": "张三"}` 287 group_in(name, ["张三"], zhangsan); 288 ```