Rust终端工具库nu的使用:高效命令行数据处理与脚本执行工具

Rust终端工具库nu的使用:高效命令行数据处理与脚本执行工具

Nushell简介

Nushell是一种新型的shell,它从PowerShell、函数式编程语言和现代CLI工具中汲取灵感。与将文件和数据视为原始文本流不同,Nu将每个输入视为具有结构的内容。例如,当你列出目录内容时,你会得到一个表格行,每行代表该目录中的一个项目。

Nushell示例

安装方法

快速安装Nu的方法:

# Linux和macOS
brew install nushell
# Windows
winget install nushell

核心概念

管道(Pipelines)

Nu在Unix管道概念的基础上进行了扩展,构建了强大的管道系统。管道中的命令分为三类:

  1. 产生流的命令(如ls
  2. 过滤流的命令(如where type == "dir"
  3. 消费管道输出的命令(如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的区别

  1. 管道传递的是结构化数据而非文本
  2. 自动类型推断(数字、日期等)
  3. 统一的命令语法,减少特殊字符的使用
  4. 内置数据可视化支持

完整示例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

这个示例演示了如何:

  1. 定义处理文件统计信息的自定义命令
  2. 实现查找重复文件的功能
  3. 使用表格输出结果
  4. 组合多个命令创建实用工具

运行方式:

nu file_analysis.nu
回到顶部