Rust终端工具库nu的使用:高效命令行数据处理与脚本执行工具
Rust终端工具库nu的使用:高效命令行数据处理与脚本执行工具
Nushell简介
Nushell是一种新型的shell,它从PowerShell、函数式编程语言和现代CLI工具中汲取灵感。与将文件和数据视为原始文本流不同,Nu将每个输入视为具有结构的内容。例如,当你列出目录内容时,你会得到一个表格行,每行代表该目录中的一个项目。
安装方法
快速安装Nu的方法:
# Linux和macOS
brew install nushell
# Windows
winget install nushell
核心概念
管道(Pipelines)
Nu在Unix管道概念的基础上进行了扩展,构建了强大的管道系统。管道中的命令分为三类:
- 产生流的命令(如
ls
) - 过滤流的命令(如
where type == "dir"
) - 消费管道输出的命令(如
table
)
ls | where type == "dir" | table
# => 显示目录内容的表格
打开文件
Nu可以加载文件和URL内容作为原始文本或结构化数据:
open Cargo.toml | get package.version
# => 0.72.0
完整示例
以下是使用Nushell进行高效命令行数据处理的几个完整示例:
示例1:处理系统进程
# 获取CPU使用率超过0%的进程列表
ps | where cpu > 0
# => 显示进程表格,包括PID、名称、CPU和内存使用情况
示例2:处理JSON数据
# 从API获取JSON数据并提取特定字段
http get https://api.example.com/data | get results.0.name
# => 提取第一个结果的名称字段
示例3:文件处理
# 统计当前目录下各类型文件的数量
ls | group-by type | each { |k,v| {type: $k, count: ($v | length)} } | sort-by count
# => 显示文件类型及其数量的表格
示例4:CSV数据处理
# 打开CSV文件并过滤数据
open data.csv | where value > 100 | sort-by date | first 5
# => 显示值大于100的前5条记录,按日期排序
配置
Nu的默认配置文件位于$nu.config-path
,启动时会自动加载。你可以自定义这个文件以满足特定需求。
插件系统
Nu支持插件,这些插件提供额外的功能并遵循与内置命令相同的结构化数据模型。插件遵循nu_plugin_*
命名约定,并通过简单的JSON-RPC协议与Nu交互。
设计目标
Nu遵循以下设计目标:
- 跨平台兼容性
- 与现有平台特定可执行文件的兼容性
- 现代软件的用户体验
- 结构化数据处理
- 无状态的功能性数据处理
Nushell为命令行数据处理和脚本执行提供了强大而现代的方法,特别适合需要处理结构化数据的场景。
完整示例demo
基于上述示例,这里提供一些更完整的Nushell使用场景:
示例5:系统监控看板
# 实时监控系统资源使用情况
def sysmonitor [] {
while true {
clear
echo "===== 系统监控看板 ====="
echo "CPU使用率:"
ps | where cpu > 0 | sort-by -r cpu | first 5 | table
echo "\n内存使用情况:"
ps | where mem > 0 | sort-by -r mem | first 5 | table
echo "\n磁盘空间:"
du | sort-by -r size | first 5 | table
sleep 3sec
}
}
示例6:数据清洗管道
# 从CSV文件中清洗并转换数据
open raw_data.csv
| rename column1=id column2=name column3=value
| where value > 100 and name != ""
| each { |it| {
id: $it.id,
name: ($it.name | str upcase),
value: ($it.value * 1.1)
}}
| save cleaned_data.csv
示例7:自动化部署脚本
# 自动化部署web应用
def deploy [env] {
let build_dir = $"build/($env)"
# 构建应用
cargo build --release
mkdir $build_dir
# 复制文件
cp target/release/app $build_dir
cp -r static $build_dir
cp config.($env).toml $build_dir/config.toml
# 上传到服务器
scp -r $build_dir user@server:/opt/app
# 重启服务
ssh user@server "systemctl restart app"
echo $"($env)环境部署完成!"
}
示例8:数据可视化
# 使用Nushell进行简单的数据可视化
def histogram [data col] {
$data
| group-by $col
| each { |k,v| {key: $k, count: ($v | length)} }
| sort-by count
| each { |it|
let bar = ($"|" * ($it.count / 3))
$"($it.key): ($bar) ($it.count)"
}
}
# 使用示例
ls | histogram type
1 回复
Rust终端工具库nu的使用:高效命令行数据处理与脚本执行工具
介绍
nu
(Nushell)是一个用Rust编写的现代终端工具,它重新思考了传统的Unix shell概念,提供了结构化数据处理能力,类似于在终端中使用电子表格或数据库。与传统的Bash/Zsh不同,nu
将命令输出视为结构化数据而非纯文本,这使得数据处理更加高效和直观。
主要特性
- 结构化数据处理:表格化输出,支持自动类型推断
- 跨平台支持:Windows/Linux/macOS
- 内置数据转换命令:过滤、排序、分组等
- 现代语法设计:类似Python/Ruby的易读语法
- 强大的脚本支持
- 可扩展性:支持自定义命令和插件
安装方法
使用Cargo安装(需先安装Rust工具链):
cargo install nu
各平台包管理器安装:
- macOS:
brew install nushell
- Linux(部分发行版):
sudo apt install nushell
或类似命令 - Windows:
winget install nushell
基本使用示例
1. 基本文件操作
# 列出当前目录文件(结构化输出)
ls
# 过滤显示大于1MB的文件
ls | where size > 1mb
# 按大小排序文件
ls | sort-by size
2. 数据处理
# 获取进程列表并过滤
ps | where cpu > 10 | select pid name cpu
# 读取CSV文件并处理
open data.csv | where value > 100 | sort-by date
3. 系统信息
# 显示系统信息
sys
# 获取内存使用情况
sys | get mem
# 获取磁盘信息
sys | get disks
4. 数学运算
# 基本计算
1 + 1
# 统计操作
[1 2 3 4 5] | math sum
# 生成序列
1..10 | each { |x| $x * 2 }
脚本编写示例
简单脚本(script.nu
)
#! /usr/bin/env nu
def greet [name: string] {
$"Hello ($name)!"
}
let names = ["Alice" "Bob" "Charlie"]
$names | each { |name| greet $name }
运行脚本:
nu script.nu
数据处理脚本
# 处理日志文件示例
open access.log
| lines
| parse "{ip} - - [{time}] \"{method} {url} {proto}\" {status} {size}"
| where status == 404
| group-by url
| sort-by count
| reverse
高级功能
1. 自定义命令
# 定义计算BMI的命令
def bmi [height: float, weight: float] {
let height_in_meters = $height / 100
$weight / ($height_in_meters * $height_in_meters)
}
bmi 175 70
2. 插件系统
nu
支持通过插件扩展功能,可以使用Rust编写高性能插件。
3. 主题定制
# 查看可用主题
theme show
# 设置主题
theme set dracula
与传统Shell的区别
- 管道传递的是结构化数据而非文本
- 自动类型推断(数字、日期等)
- 统一的命令语法,减少特殊字符的使用
- 内置数据可视化支持
完整示例demo
以下是一个结合数据处理和自定义命令的完整示例:
#! /usr/bin/env nu
# 定义计算文件统计信息的命令
def file-stats [dir: path] {
ls $dir
| where type == "file"
| select name size modified
| upsert size { |f| $f.size / 1024 | math round } # 转换为KB
| rename 文件名 大小(KB) 修改时间
}
# 定义查找重复文件的命令
def find-duplicates [dir: path] {
ls $dir
| where type == "file"
| group-by size
| where ($it.items | length) > 1
| select size items
| flatten items
| select name size
| sort-by size
}
# 主程序
def main [] {
print "文件统计信息:"
file-stats . | table -n 1
print "\n重复文件查找:"
find-duplicates . | table -n 1
}
main
这个示例演示了如何:
- 定义处理文件统计信息的自定义命令
- 实现查找重复文件的功能
- 使用表格输出结果
- 组合多个命令创建实用工具
运行方式:
nu file_analysis.nu