广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Rust实现grep命令行工具的方法
  • 181
分享到

Rust实现grep命令行工具的方法

2024-04-02 19:04:59 181人浏览 泡泡鱼
摘要

目录一、功能:二、介绍2.1 使用到的知识:2.2 代码三、使用一、功能: 1、输入要查询的字符串和文件名,输出所有匹配的行的内容 2、如果设置环境变量IGNORE_CASE,则gr

一、功能:

1、输入要查询的字符串文件名,输出所有匹配的行的内容

2、如果设置环境变量IGNORE_CASE,则grep匹配将忽略大小写

3、可使用 > 符号来重定向标准输出到指定文件中

二、介绍

2.1 使用到的知识:

  • 读取命令行参数
  • 读取文件内容
  • 错误处理
  • Test Driven Development(TDD)
  • 使用环境变量控制不同行为

2.2 代码

1、main.rs

use std::env;
use std::process;
use minigrep::Config;
fn main() {
    // let args: Vec<String> = env::args().collect();
    // let query = &args[1];
    // let filename = &args[2];

    // let content = fs::read_to_string(filename).expect("You have a problem in read a file");
    // println!("Filename: {}", filename);
    // println!("File content:\n{}", content);

    //refactoring after
    let args: Vec<String> = env::args().collect();
    // let config = Config::new(&args);
    let config = Config::new(&args).unwrap_or_else(|err| {
        eprintln!("Problem parse arguments: {}", err);
        process::exit(1);
    });
    println!("query: {}, filename: {}", config.query, config.filename);
    
    if let Err(e) = minigrep::run(config) {
        eprintln!("Application Error: {}", e);
        process::exit(1);
    }
}

2、lib.rs

use std::error::Error;
use std::fs;
use std::env;
pub struct Config {
    pub query: String,
    pub filename: String,
    pub ignore_case: bool,
}
impl Config {
    // fn new(args: &[String]) -> Config {
    //     let query = args[1].clone();
    //     let filename = args[2].clone();
    //     Config {query, filename}
    // }
    pub fn new(args: &[String]) -> Result<Config, &'static str> {
        if args.len() < 3 {
            return Err("No enough arguments");
        }
        let query = args[1].clone();
        let filename = args[2].clone();
        let ignore_case = env::var("IGNORE_CASE").is_ok();
        Ok(Config{query, filename, ignore_case})
    }
}
pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    let content = fs::read_to_string(config.filename)?;
    // println!("With text:\n{}", content);
    let result = if config.ignore_case {
        search_case_insensitive(&config.query, &content)
    } else {
        search(&config.query, &content)
    };
        for line in result {
            println!("{}", line);
    }
    Ok(())
}

pub fn search<'a>(query: &str, content: &'a str) -> Vec<&'a str> {
    let mut result = Vec::new();
    for line in content.lines() {
        if line.contains(query) {
            result.push(line);
        }
    }
    result
}

pub fn search_case_insensitive<'a>(query: &str, content: &'a str) -> Vec<&'a str> {
    let mut result = Vec::new();
    let query = query.to_lowercase();
    for line in content.lines() {
        if line.to_lowercase().contains(&query) {
            result.push(line);
        }
    }
    result
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn one_result() {
        let query = "xwp";
        let content = "\
Hello,rust!
xwp is handsome
You know!";
        assert_eq!(vec!["xwp is handsome"], search(query, content));
    }

    #[test]
    fn case_insensitive() {
        let query = "xWp";
        let content = "\
Hello,rust!
xwp is handsome
You KonW";
        assert_eq!(vec!["xwp is handsome"], search_case_insensitive(query, content));
    }
}

三、使用

  • 需要输入两个参数,第一个是query,第二个是filename,如果参数少于两个会报错。
  • 如:carGo run xwp xwphs.txt,xwp是要查询的内容,xwphs.txt是文件。
  • minigrep默认是大小写敏感的,可通过设置IGNORE_CASE环境变量,使得查询忽略大小写。

在powershell中设置临时环境变量如:$Env:IGNORE_CASE=1,解除:Remove-Item Env:IGNORE_CASE;在shell中直接:将IGNORE_CASE=1放在最开始

参数不足时,提示Problem parse arguments: No enough argumentss

在这里插入图片描述

设置环境变量后,不区分大小写,查询到了信息

在这里插入图片描述

到此这篇关于Rust实现grep命令行工具的文章就介绍到这了,更多相关Rust命令行工具内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Rust实现grep命令行工具的方法

本文链接: https://www.lsjlt.com/news/165271.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Rust实现grep命令行工具的方法
    目录一、功能:二、介绍2.1 使用到的知识:2.2 代码三、使用一、功能: 1、输入要查询的字符串和文件名,输出所有匹配的行的内容 2、如果设置环境变量IGNORE_CASE,则gr...
    99+
    2022-11-13
  • Node.js怎么实现命令行工具
    这篇“Node.js怎么实现命令行工具”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Node.js怎么实现命令行工具”文章吧...
    99+
    2023-07-04
  • 通过Golang实现linux命令ls命令(命令行工具构建)
    目录ls 命令os.Args 读取参数pflag小结ls 命令 要实现ls,首先先我们复习一下ls命令。 ls不加任何参数,表示查询当前目录下的文件/文件夹ls后面加上路径,列出所有...
    99+
    2023-01-13
    Golang实现命令行工具 Golang命令行工具 Golang命令行
  • 使用mysqldump工具实现备份mysql命令方法
    下面一起来了解下使用mysqldump工具实现备份mysql命令方法,相信大家看完肯定会受益匪浅,文字在精不在多,希望使用mysqldump工具实现备份mysql命令方法这篇短内容是你想要的。mysqldu...
    99+
    2022-10-18
  • Redis命令行工具有哪些使用方法
    这篇文章主要介绍“Redis命令行工具有哪些使用方法”,在日常操作中,相信很多人在Redis命令行工具有哪些使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis命令行工具有哪些使用方法”的疑惑有所...
    99+
    2023-06-04
  • 利用node.js制作命令行工具方法教程(一)
    前言 之前使用过一些全局安装的NPM包,安装完之后,可以通过其提供的命令,完成一些任务。比如Fis3,可以通过fis3 server start 开启fis的静态文件服务,通过fis3 release开启文...
    99+
    2022-06-04
    命令行 工具 方法
  • 实用的Linux命令行工具有哪些
    这篇文章主要介绍实用的Linux命令行工具有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在Linux下的三个命令行工具,分别是管理网络的nmcli,管理软件包的pkcon,管理系统进程的systemctl。Ne...
    99+
    2023-06-16
  • Go命令行工具项目结构最佳实践方法教程
    这篇文章主要介绍“Go命令行工具项目结构最佳实践方法教程”,在日常操作中,相信很多人在Go命令行工具项目结构最佳实践方法教程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go...
    99+
    2022-10-19
  • Linux命令工具的使用方法是什么
    这篇文章给大家介绍Linux命令工具的使用方法是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Linux 上有太多的命令了,如果背的话不知道得背到什么时候,但是Linux中有 Bash 命令历史以及像 apropo...
    99+
    2023-06-28
  • Linux 命令行工具解析和格式化输出 JSON的方法
     jsON 是一种轻量级且与语言无关的数据存储格式,易于与大多数编程语言集成,也易于人类理解 —— 当然,如果格式正确的话。JSON 这个词代表 J ava S cript O bject N otation,...
    99+
    2022-06-04
    linux 命令行工具 格式化输出 json 命令格式化
  • 实用工具mycli:MySQL、MariaDB 和 Percona 的命令行界面
    mycli 是默认的 MySQL 客户端的现代替代品,mycli 将在你输入时自动补全关键字、表名、列和函数。HomePage: http://mycli.net 使用效果如下:RHEL, Centos安装...
    99+
    2022-10-18
  • Golang 基于flag库实现一个简单命令行工具
    目录前言flag 库FlagSet需求拆解实现 weather flag天气数据打印获取源数据数据转换运行效果小结前言 Golang 标准库中的 flag 库提供了解析命令行选项的能...
    99+
    2022-11-11
  • Linux使用内置的跟踪工具last命令的方法
    这篇文章主要讲解了“Linux使用内置的跟踪工具last命令的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux使用内置的跟踪工具last命令的方法”吧!  last命令的功能是什...
    99+
    2023-06-13
  • C++执行shell命令的多种实现方法
    目录1、system(执行shell 命令)2、popen(建立管道I/O)3、使用vfork()新建子进程,然后调用exec函数族在linux系统下,用C++程序执行shell命令...
    99+
    2022-11-12
  • 如何实现一个在vbs运行命令行工具后让命令窗口保持打开状态的脚本
    这篇文章给大家分享的是有关如何实现一个在vbs运行命令行工具后让命令窗口保持打开状态的脚本的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。问: 如何在运行像 Ping 或 Ipconf...
    99+
    2023-06-08
  • MyBatis命令行实现逆向工程的示例
    这篇文章主要介绍了MyBatis命令行实现逆向工程的示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.MyBatis逆向工程介绍在开发过...
    99+
    2022-10-18
  • Python命令行运行文件的实例方法
    1、说明 写了python文件,想通过命令执行它,进入目录,并在命令执行中输入python文件名称。 2、实例 例如,桌子上有文件hello.py,内容是印刷一句话 print(...
    99+
    2022-11-11
  • mysate中stat命令的实现方法
    目录一、stat(1)二、man -k ,grep -r的使用三、伪代码四、产品代码 mystate.c的码云链接五、测试代码,mystat 与stat(1)对比一、stat(1) ...
    99+
    2022-11-13
    mysate中stat命令 stat命令
  • 基本Linux命令行工具的现代化替代品有哪些
    小编给大家分享一下基本Linux命令行工具的现代化替代品有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1. 作为 du 替代品的 ncduNCurses 磁盘利用率(ncdu)工具提供了与 du 类似的结果,但是在一...
    99+
    2023-06-15
  • hive-shell批量命令执行脚本的实现方法
    如下所示: #!/usr/bin/bash HADOOP_HOME="/opt/module/cdh-5.3.6-ha/hadoop-2.5.0-cdh5.3.6" HIVE_HOME='/opt/module/cd...
    99+
    2022-06-04
    hive shell 命令
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作