惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

SecWiki News
SecWiki News
I
InfoQ
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
博客园 - Franky
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
博客园_首页
罗磊的独立博客
V
V2EX
李成银的技术随笔
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
True Tiger Recordings
Vercel News
Vercel News
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
F
Fox-IT International blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
M
Microsoft Research Blog - Microsoft Research
Know Your Adversary
Know Your Adversary
爱范儿
爱范儿
The Register - Security
The Register - Security
G
Google Developers Blog
The Hacker News
The Hacker News
Malwarebytes
Malwarebytes
S
Securelist
博客园 - 三生石上(FineUI控件)
Jina AI
Jina AI
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
S
SegmentFault 最新的问题
博客园 - 叶小钗
F
Fortinet All Blogs
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
博客园 - 聂微东
T
Threatpost
博客园 - 【当耐特】
D
Docker
P
Privacy & Cybersecurity Law Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
G
GRAHAM CLULEY
V
Visual Studio Blog
C
Cisco Blogs
IT之家
IT之家
S
Security Archives - TechRepublic
Latest news
Latest news
阮一峰的网络日志
阮一峰的网络日志

硅上观道・我的个人技术博客

函数式心法 (3):巧用柯里化和部分应用 函数式心法 (2):理解运用高阶函数 打造 NixOS 开发环境 (2):NixOS学习与配置入门指南 打造 NixOS 开发工作流 (1):为什么选择 NixOS Haskell 心法 (1):初识 - 为何学、学什么和怎么学 Clojure 笔记 (2):基本语法结构和 REPL 驱动编程 Clojure 笔记 (1):语言生态介绍和环境配置 前端笔记 (1):ES 标准和 ES6+ 变量定义方法 当我们发现毕生追求的知识在AI面前毫无价值时,如何重建存在的意义? 5 月 28 日 DeepSeek R1 模型完成小版本试升级并开源,具体有哪些提升? 信息闭塞和被信息洪流冲刷,哪个弊端更大?谈错误信息的危害性 Rust CLI 实战:手搓微型 grep (4) 交互式处理错误文件名问题 Rust CLI 实战:手搓微型 grep (3) 更优雅的错误处理 Rust CLI 实战:手搓微型 grep (2) 实现软件第一版 学计算机有什么好的获取学习资料的方法?掌握高效的资料收集技巧 有哪些看起来很高端的技术其实原理很暴力很初级?浅析CDN内容分发网络原理 学习编程可以为自己带来什么?- 理论与实践的紧密结合 长文 - 大一技术成长复盘:课程、竞赛与开源之旅 推荐一个IDE中的AI工具 - CodeGeex插件和AI辅助编程 关于本站 - 一篇旧文章,我对本站内容更新计划的最初想法 读书笔记:读庄子《齐物论》,探寻真正的自我 读书笔记 - 单向度的人:核心思想,内容解析以及我的感悟 一篇时评写作练习:矛盾与救赎 - 关于行善
Rust CLI 实战:手搓微型 grep (1) 新建项目
硅上观道 · 2025-05-16 · via 硅上观道・我的个人技术博客
技术教程

CLI 工具是 rust 非常擅长的一个领域。从这篇文章开始,我将带大家从零开始做一个简易 grep 命令行工具。

CLI 工具是 rust 非常擅长的一个领域。从这篇文章开始,我将带大家从零开始做一个简易 grep 命令行工具。

本专栏主要参考了该教程,也欢迎关注这个系列专栏,我将更新更多精彩内容。


可爱的rust logo面包蟹

1. 目标

我们的目标主要是为了能够实现一个简易的grep命令行工具。

英文教程原作者给这个软件起名grrs(读作 grass),那么我们也叫这个名字吧!

简单而言,这个软件可以对纯文本文件的内容进行查询。

我们希望实现的基本内容查询命令是:

grrs.exe <PATTERN> <PATH>

也就是说,我们需要传入一个搜索模式,和一个被搜索文件的路径。这样的设计,和grep的原版设计是一样的。

例如,我们可能想要查./src/main.rs文件中包含的content变量名的内容:

搜索成功命令行界面示意

这就是我们第二篇文章全部完成后将达到的效果,是不是很清晰呢?

也就是说,读完本专栏头两篇文章,就可以实现grrs最初可用原型。


2. 前置知识

这个系列教程假定读者是掌握其他编程语言,但是对 rust 不够熟悉的开发者。我将尽我所能地介绍一些 rust 独有的编码风格和语言特性,帮助对 rust 特有机制不够熟悉的朋友理解这个语言。

当然,如果你在阅读过程中遇到任何问题,欢迎在评论区留言,也可以查阅 rust 语言的官方入门教程

在开始我们正式讲解前,你需要准备的是可以在本地运行的 rust 环境。本文写作时使用的 rustc 版本为:

rustc 1.87.0 (17067e9ac 2025-05-09)

我建议读者在运行本项目的代码时还是使用最新的 rust 工具链版本。即便 rust 未来有了新的变化,这个项目的代码基本可以肯定还是能够继续运行的。


3. 新建项目

rust 的工程管理工具是 Cargo。这个工具基本集成了 rust 开发全部所需的周边支持基础设施,包括包管理、代码格式化(fmt)、测试(test)、代码风格检查(clippy)等,总之就是非常好用。

我们新建一个项目:

cargo new grrs
cd grrs

进入目录后,我们可以看到 cargo 为我们建立的文件夹结构是:

./
├── .gitignore
├── Cargo.lock
├── Cargo.toml
└── src/
    └── main.rs

这些文件的作用是:

  • .gitignore:帮助 git 理解需要忽略哪些文件和文件夹,不被计入版本管理
  • Cargo.lock:Cargo 自动生成的详细依赖信息,不需要开发者阅读理解
  • Cargo.toml:开发者自己维护的项目元数据和依赖信息。用好这个 toml 文件,就可以对项目的各种依赖库进行轻松的增加、删除、升级等操作
  • src文件夹:一般源代码放在这个文件夹下
    • main.rs:Cargo 自动生成的 hello world 代码文件。注意 rust 代码后缀是.rs

用你最喜欢的代码编辑器打开main.rs,你应该看到如下内容:

fn main() {
    println!("Hello, world!");
}

让我们运行一下这个初始项目:

cargo run

你应该能够看到如下输出结果:

程序输出的hello world结果

如果你的程序正常输出了"Hello world!",那么恭喜你,你的环境配置成功,你已经具备进入正式工程的全部基础了!

下一篇文章,我们将一起实现这个 CLI 工具的初始版本。


希望这篇博客能帮助到你,也欢迎关注交流。愿与君共勉!

点击阅读下一篇文章