1 个稳定版本

1.0.0 2024 年 3 月 31 日

#7#checking

MIT 许可证

41KB
1K SLoC

schematch

声明性模式检查命令

安装

cargo install schematch

使用

Usage: schematch [OPTIONS] <SCHEMA> [FILE]

Arguments:
  <SCHEMA>  The schema to check against
  [FILE]    The file to check. If not provided, stdin will be used

Options:
  -s, --schema-type <SCHEMA_TYPE>  Schema type. schematch support tsv and json, If not provided tsv will be used [default: tsv] [possible values: tsv, json]
  -h, --help                       Print help
  -V, --version                    Print version

快速入门

您可以验证您数据的模式

例如,当您有 data.txt

1 [email protected]   John_Doe
2 [email protected] Sherry_Berry
3 [email protected]    Ram_Singh

然后您可以像这样验证您数据的模式

$ cat data.txt | schematch "id:integer email:string name:string"
1 [email protected]   John_Doe
2 [email protected] Sherry_Berry
3 [email protected]    Ram_Singh

$ echo $?
0

如果您的数据有效,那么 schematch 的退出码是 0,否则是 1。

Schematch 不会修改接收到的数据,并且以原始形式将其发送到 stdout。因此,schematch 可以通过 'pipe' 与其他命令灵活协作,并可以轻松集成到现有的 shell 脚本管道中。

例如)

$ cat data.txt                                    |
  schematch "id:integer email:string name:string" |
  awk '{print $1, $3}'                            |
  schematch "id:integer name:string"              |
  .
  .
  .

为什么?

Unix shell 小巧美观且高度可组合。然而,它们通常不太易读和理解。这部分是因为很难看到每个命令如何与数据交互。要完全理解 shell 脚本在做什么,您需要了解 catfind 命令读取的文件的数据结构,以及 awksed 如何处理它们。

然而,shell 脚本只描述后者信息(即数据是如何处理的)。前者信息(即原始数据和处理后的数据的结构)始终在文件中,并且永远不会在 shell 脚本中以声明性方式描述。

Schematch 允许前者信息(即数据结构)包含在 ShellScript 管道中。

例如,要使用 shell 从 Apache 日志文件中输出每小时的访问次数,可能编写以下 shell 脚本

cat/var/log/apache2/access.log|awk'{print$4}' |cut-b2-15 |sort|uniq-c

这当然可以很好地工作,但很难理解每个命令的作用。

Schematch 可以改变这一点

cat        /var/log/apache2/access.log                                       |
schematch 'ip:string localuser:string remoteuser:string time:string 
           res:string status:number bite:number referer:string agent:string' |
awk       '{print $4}'                                                       |
schematch 'time:string'                                                      |
tr        ':/' ' '                                                           |
schematch 'date:number month:string year:string h:number m:number s:number'  |
awk       '{printf "%s_%s\n", $1, $2}'                                       |
schematch 'date_month:string'                                                |
sort                                                                         |
uniq -c

它以声明性方式描述了管道中数据的结构以及每个命令如何对数据进行语义处理。

支持的 Schema

  • tsv
  • json

Tsv

使用

$ cat data.txt
1 [email protected]  true  Jhon_Doe
2 [email protected] false Emily_Lua
3 [email protected]  true  _
$ cat data.txt | schematch "id:integer  email:string  is_active:boolean  name:string|null" > /dev/null

$ echo $?
0

支持类型和值

类型 有效值 无效值
整数 1449-4 等。 1.0x123
浮点数 14.0-39 等。 xxyy
字符串 aaabbbc 等。 字符串接受任何内容
布尔值 truefalse 除了有效字符以外的所有字符都是无效的
空值 _ 除了有效字符以外的所有字符都是无效的

Json

$ cat data.txt
{
  "group": "Group1",
  "members": [
    {"id": "aaa", "name": "Jhon"},
    {"id": "bbb", "name": "Mary"}
  ]
}
$ cat data.txt | schematch --schema-type json "{group: string, members: Array<{id: string, name: string}>}" > /dev/null

$ echo $?
0

支持的数据类型

  • 空值
  • 字符串
  • 数字
  • 布尔值
  • 对象

依赖项

~1.7–2.7MB
~51K SLoC