对golang版本的selpg的理解

实现和测试主要参考用 Go 实现简单命令行实用程序 selpg,并做了一些改进。
其实实现逻辑并不复杂,难点在于对Linux和Go的各种包和接口的理解和使用。

使用pflag代替flag

flag和pflag都是源自于Google,工作原理甚至代码实现基本上都是一样的。 flag虽然是Golang官方的命令行参数解析库,但是pflag却得到更加广泛的应用,因为支持更精细的变量类型和更丰富的功能。

引进pflag包

import flag "github.com/spf13/pflag"

pflag原生支持shorthand,在定义flag的时候为其指定shorthand,实现起来更加方便。flag虽然能够通过间接方式实现shorthand,但是flag的数量要翻倍,同时不能避免这两个flag被同时使用的错误用法。
第一个string表示全称,使用 --,第二个是缩写,使用 -

var ip = flag.IntP("flagname", "f", 1234, "help message")
var flagvar bool
func init() {
	flag.BoolVarP("boolname", "b", true, "help message")
}
flag.VarP(&flagVar, "varname", "v", 1234, "help message")

命令行 - 和 – 的区别
UNIX/Linux/BSD、POSIX、GNU的来源

实现效果
在这里插入图片描述

os/exec包用于执行外部命令

/**确定输出源, 是否打印到打印机
  * 由于没有打印机测试,用管道接通 grep 作为测试,结果输出到屏幕
  * selpg内容通过管道输入给 grep, grep从中搜出带有keyword文件的内容
  */
if sa.printDest != "" {
    cmd := exec.Command("grep", "-nf", "keyword")
    inpipe, err = cmd.StdinPipe()
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    defer inpipe.Close()
    cmd.Stdout = fout
    cmd.Start()
}

func Command(name string, arg …string) *Cmd

command返回cmd结构来执行带有相关参数的命令,name为命令名称,arg为命令所需要的参数, … 表示可以接受多个string。

func (c *Cmd) StdinPipe() (io.WriteCloser, error)

返回一个连接到命令标准输入的管道,即inpipe会作为命令的输入,不用自己创建io.Pipe
WriteCloser 包含一组接口

type WriteCloser interface {
		// Writer 接口包装了基本的 Write 方法,用于将数据存入自身。
		// Write 方法用于将 p 中的数据写入到对象的数据流中
        Writer 
        // Closer 接口包装了基本的 Close 方法,用于关闭数据读写。
		// Close 一般用于关闭文件,关闭通道,关闭连接,关闭数据库等
        Closer
}

Linux grep命令用于查找文件里符合条件的字符串,如果发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为"-",则grep指令会从标准输入设备读取数据。

  • -n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
  • -f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。

这里的规则文件是keyword,里面只有一个字符 i

测试

运行结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码地址

https://github.com/CurryYuan/Service-Computing/tree/master/selpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值