跳过正文
  1. Lumesh 用例/

Lumesh 日常应用举例

1548 字·4 分钟
目录

数据结构操作示例
#

  • 直接访问嵌套属性
1let user = {
2    name: "Alice",
3    profile: {
4        age: 25,
5        skills: ["rust", "javascript", "python"]
6    }
7}
8user.profile.skills@1  # 输出: "javascript"
  • 链式调用
11...10 | .map(x -> x * 2) | .filter(x -> x > 10)
2# 链式调用,清晰直观
  • 循环派发管道
1ls -1 |> print "-->" _ "<--"
  • 结构化管道
1df -H | Into.table() | pprint
2Fs.ls -l | where(size > 5K) | select(name,size,modified)
  • 错误捕获
16 / 0 ?.               #忽略错误
26 / 0 ?: x -> print x  #处理错误
  • 数据调试
1let a := (x) -> x + 1
2debug a
  • 映射操作
 1# 映射转换
 2let data = {a: 1, b: 2, c: 3}
 3
 4# 键值同时转换
 5let result = Map.map(
 6    k -> k.to_upper(),     # 键转换函数
 7    v -> v * 2,         # 值转换函数
 8    data
 9)
10# 结果: {A: 2, B: 4, C: 6}

实用示例
#

文件处理:
#

  • 找出大于5KB且在24小时内修改过的文件,以表格显示:

    1Fs.ls -l ./src/ | where(size > 5K) | where (Fs.diff('d',modified)>1) | pprint
  • 将当前目录及其子目录下的所有rs源码文件备份:

    1. 方式1: 使用循环派发管道
    1  ls **/*.rs |> cp _ ./backup/
    1. 方式2: 使用循环
    1  for f in **/*.rs {
    2      cp _ ./backup
    3  }
  • 去除文件中的注释并保存

    1. 方式1: 函数式
    1let content = Fs.read("data.txt")
    2let lines = content.lines()
    3let filtered = lines | List.filter(line -> !line.starts_with('#'))
    4# 写入结果
    5filtered.join('\n') | Fs.write("output.txt")
    1. 方式2: 使用链式调用
    1Fs.read("data.txt").lines().filter(x -> !x.starts_with('#')) >> "output.txt"
    1. 方式2: 使用链式管道
    1Fs.read("data.txt") | .lines() | .filter(x -> !x.starts_with('#')) >> "output.txt"

系统管理
#

  • 找出cpu占用率超过2%的用户进程,以表格显示
1 ps u -u1000 | Into.table() | where( Into.float(CPU) > 2.0 ) | pprint
  • 找出内存使用超过10%的进程
1ps u -u1000 | Into.table() | where( Into.float(MEM) > 10.0 ) | pprint

网络操作
#

  • 请求json数据并解读为表格
1# HTTP 请求
2curl 'https://jsonplaceholder.typicode.com/posts/1/comments' | From.json() | pprint
3
4# 进一步筛选
5curl 'https://jsonplaceholder.typicode.com/posts/1/comments' | From.json() | where(id < 3) | select(name,email)| pprint
  • 请求json数据并转为其他格式保存
1let a = curl 'https://jsonplaceholder.typicode.com/posts/1/comments' | From.json()
2a >> data.json                         # json 格式
3a | Into.csv() >> data.csv         # csv 格式
4a | Into.toml() >> data.toml       # toml 格式
5
6# a 已经是Lumesh的有效表达式
7type a     # List
8len(a)     # 可以进行其他常规操作

运维脚本
#

  • 写一个脚本让用户选择可挂载磁盘
 1let sel = ( lsblk -rno 'name,type,size,mountpoint,label,fstype' | Into.table([name,'type',size,mountpoint,label,fstype]) \
 2    | where($type!='disk' && !$mountpoint && $fstype !~: 'member') \
 3    | Ui.pick "which to mount:") ?: { print 'no device selected' }
 4
 5if $sel {
 6    let src = (sel.type == 'part' ? `/dev/${sel.name}` : `/dev/mapper/${sel.name}`)
 7    let point = (sel.label==None ? sel.name : sel.label)
 8    let dest = `/run/user/${id -u}/media/${point}`
 9    if !Fs.exists($dest){ mkdir -p $dest }
10    sudo mount -m -o 'defaults,noatime' $src $dest  ?: \
11        e -> {notify-send 'Mount Failed' $e.msg; exit 1}
12    notify-send 'Mount' `device $src mounted`
13}

常用内置模块
#

文件系统模块 (Fs)
#

 1# 目录操作
 2Fs.ls("/path")              # 列出目录内容
 3Fs.mkdir("new_dir")         # 创建目录
 4Fs.rm("empty_dir")       # 删除空目录
 5
 6# 文件操作
 7Fs.read("file.txt")         # 读取文件
 8Fs.write("file.txt", data)  # 写入文件
 9Fs.append("Log.txt", entry) # 追加内容
10
11# 路径操作
12Fs.exists("/path/to/file")  # 检查路径是否存在
13Fs.is_dir("/path")          # 检查是否为目录
14Fs.canon("./relative/path") # 获取绝对路径

系统目录访问
#

1# 获取系统目录
2let dirs = Fs.dirs()
3println(dirs.home)      # 用户主目录
4println(dirs.config)    # 配置目录
5println(dirs.cache)     # 缓存目录
6println(dirs.current)   # 当前工作目录

文件列表详细信息
#

1# ls 命令选项
2Fs.ls -l        # 详细信息
3Fs.ls -a        # 显示隐藏文件
4Fs.ls -L        # 跟随符号链接
5Fs.ls -u        # 显示用户信息
6Fs.ls -m        # 显示权限模式
7Fs.ls -p        # 显示完整路径

常用内置函数
#

核心函数
#

 1# 数据操作
 2len(collection)             # 获取长度
 3type(value)                 # 获取类型
 4rev("string")               # 反转字符串/列表
 5flatten([[1,2],[3,4]])      # 扁平化嵌套结构
 6
 7# 执行控制
 8eval(expression)            # 求值表达式
 9exec_str("let x = 10")      # 执行字符串代码
10include("script.lm")        # 包含文件到当前环境
11import("module.lm")         # 导入模块到新环境

数据查询和过滤
#

 1# 数据表格操作
 2let users = [
 3    {name: "Alice", age: 25, active: True},
 4    {name: "Bob", age: 30, active: False},
 5    {name: "Carol", age: 35, active: True}
 6]
 7
 8# 过滤行
 9let active_users = where(active, users)
10
11# 选择列
12let names_ages = select(name, age, users)

命令执行系统
#

外部命令执行
#

Lumesh 支持多种命令执行模式:

1# 基本命令执行
2ls -la
3
4# 后台执行
5command &
6
7# 静默执行
8command &-

PTY 支持
#

对于需要终端交互的程序,Lumesh 提供 PTY 支持:

1# 自动判断并启用PTY模式
2ls -l | vi
3
4# 强制PTY 模式(交互式程序), 一般无需如此
5ls -l |^ vi
6'' |^ vi 'file.txt'

脚本执行
#

脚本运行器
#

Lumesh 提供两种执行模式:

1# 直接执行命令
2lumesh -c "print 'Hello World'"
3
4# 执行脚本文件
5lumesh script.lm arg1 arg2
6
7# 脚本中访问参数
8println(argv[0])  # 第一个参数

测试示例
#

 1#!/usr/bin/env lumesh
 2
 3# 测试函数
 4fn assert(actual, expected, test_name) {
 5    if actual != expected {
 6        print "[FAIL]" test_name "| 实际:" actual "| 预期:" expected
 7    } else {
 8        print "[PASS]" test_name
 9    }
10}
11
12# 变量赋值测试
13let x = 10
14assert(str(x), "10", "单变量赋值")
15
16# 延迟赋值测试
17x := 2 + 3
18assert(eval(x), 5, "延迟赋值求值")

日志系统
#

日志级别管理
#

 1# 设置日志级别
 2Log.set_level(Log.level.info)    # 设置为 INFO 级别
 3
 4# 检查日志级别
 5if Log.enabled(1) {
 6    Log.debug("调试已开启")
 7}
 8Log.info("调试信息")
 9
10# 禁用日志
11Log.disable()

了解更多:

相关文章