Nushell 使用说明及总结

发布时间 2023-10-18 20:06:45作者: yun@dicom

介绍

作为 Shell 语言, 我特别喜欢 Nushell 的如下几个特点:

  • 来自 UNIX Shell 的管道, 把多个命令连接在一起
  • 函数式编程风格

   事实上, 管道操作符 (|) 也是很多函数式编程的操作符

  • 丰富的对象化的数据结构
  • 对结构化文件的处理, 比如 JSON, XML, CSV, TOML 等
  • 基于模板的字符串解析
  • 在线帮助
  • 输出结果是彩色的, 而且是表格化的, 还自带编号 ! 真贴心 !
  • Footprint 很小, 安装后 < 30M (0.85 版本)

本文内容大多数来自 http://www.nushell.sh/zh-CN/book/ (文中简称 book), 但是也有很多我自己的理解.

鉴于 book 中, 已经把 Nushell 的介绍和使用说的非常详细了, 本文不打算重复或抄录其内容, 更多是补充和总结.

 

基础知识

 

1. 数据类型

关于 Nushell 的数据类型, 这里强调和补充几个要点:

  • 可以用 describe 命令来获得前一个管道输出的数据类型描述

比如 ls | describe, 就可以知道 ls 输出的 table 的表头的名称和类型, 在编写后面的语句时, 能参考这些名字

  • 可以用 into <type> 来把前一个管道输出的数据类型转换成当前引用的数据类型
  • 字符串可以用单引号, 也可以用双引号, 两者稍有不同
  • 字符串也可以不用任何引号, 这叫裸字符串. 比引号更好的地方在于, 裸串不需要转义

例如:

open d:\tmp\aa.txt

 对比: 

open "d:\\tmp\\aa.txt"

 

  • null 是特殊的,内定的数据, 表示 "没数据/未定义", 类似 C 中的 void, C# 中的 null, 或 Python 中的 None.

例如下面语句中的 null

[[meal size]; [arepa, null] ] | is-empty meal # false

 对比: 

  • 区间还可以用负数表示, 但是需要加上括号, 否则容易引起编译器误解. 例如下面的语句: 
'abcd12345678' | str substring (-5..-2)  #456

(-5..-2) 的意思是, 从倒数第五开始, 到倒数第二结束.

也可以省略区间的结尾. 比如:

(-3..)   意思是, 从倒数第三个位置开始取, 直到末尾. 即等于 (-3, -2, -1)

这个设计理念应该是从 Python 借用过来的.

负数区间在切片时非常有用

  • 用字符串的 parse 命令, 可以把一个字符串解释成若干列. 这个 "按模式切片" 的功能, 真是日志分析的利器.

2. 变量


* Nu 中的变量,其实是 "常量", 一旦赋值后就不允许修改
* 与常规编程语言类似, 变量有作用域, 子域可以使用同名变量, 不会覆盖父域的同名变量
* 变量支持路径.
比如 print $val.name

3) 子表达式
* 可以通过圆括号 () 来执行一个子表达式并使用其结果.
例如 (ls)
* 子表达式也支持路径
例如 (ls).name
* 子表达式可以简化
ls | where size > 10kb
其实是简化的子表达式. 完整的语法应该是
ls | where {|it| $it.size > 10k}
上述语法也可以部分简化成:
ls | where $it.size > 10k
ls | where ($it.size > 10k)
* 简化后的子表达式, 路径名必须写在前面.
以下语句非法:
ls | where size > 10k
但以下语句合法:
ls | where 10k < $it.size
ls | where (10k < $it.size)

 

ls 命令介绍

 

列表 (list) 及处理

 

字符串及处理

 

path 命令

 

系统命令

 

常用的 Filter 命令

 

 

系统或平台相关的命令

 

核心命令

 

几个综合应用的例子