《现代命令行工具指南》3. 选取字符:让选取字符变得轻而易举 - choose

Posted 毕小烦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《现代命令行工具指南》3. 选取字符:让选取字符变得轻而易举 - choose相关的知识,希望对你有一定的参考价值。

​好工具就是生产力,这是专栏《现代命令行工具指南》精讲的第 3命令行工具,欢迎品鉴。

假如有一行文本是:

choose sections from each line of files

如果你想从这一行文本中选取一部分,比如选取第 2 和第 3 个字段,你会怎么做?用 awk 还是 cut

awk 实现:

$ echo "choose sections from each line of files"|awk 'print $1 $2'
choosesections

cut 实现:

$ echo "choose sections from each line of files"|cut -d " " -f 1 -f 2
choose sections

其实,你看,不管是用 awk 还是 cut,似乎都不够简单。awk 是一门文本处理语言,功能当然是非常强大,但用起来却没那么简单,光是括号引号就让你眼花缭乱,而用 cut 命令也是一样不简单。

但用choose,选取字符就会变得轻而易举。

比如,用 choose 实现上述需求:

$ echo "choose sections from each line of files"|choose 0 1
choose sections

简单吧! 那 choose 是什么?

简介

choose 是一款用于选取字段或字符的命令行工具,它以一种对人类友好且快速的方式选取文件每一行的字段或字符。

默认情况下,choose 认为字段之间以空格作为分隔符,从 0 开始索引,通过索引选择内容。可同时选取多个索引的内容,支持类似 Python 列表的切片选择语法,以及行尾的负索引等功能。

当然,如果不想用默认的空格作为分隔符,也可以自行指定,不想以 0 开始索引,也可以从 1 开始。

总之,在选取字符和字段方面,完全可以使用 choose 来替代 cutawk 的这部分功能。

一句话总结:因为专注,所以简单。其他命令要么太「重」,要么太「繁」,要么太「慢」, choose 实现了截取每行字符这一单一场景的最优解决方案。

基本信息

工具名称choose
当前版本1.3.4
开发语言Rust(93.5%)
适用平台macOS、Linux、Windows
开源地址https://github.com/theryangeary/choose
当前星标1.3k

功能特性

  • 支持选取文件中每一行的字段或字符;
  • 支持类似 Python 列表的切片选择语法;
  • 支持行尾的负索引;
  • 分隔符默认是空格,可指定;
  • 默认索引从 0 开始,可指定从1开始。

准备环境

各平台(macOS/Linux/Windows)通用的安装方法是使用 Cargo 安装。

安装命令:

cargo install choose

如果安装了 Homebrew/Linuxbrew,也可以使用 brew 安装:

brew install choose-rust

安装成功之后,查看帮助信息。

帮助信息:

$ choose -h
choose 1.3.4
`choose` sections from each line of files

用法:
    choose [标记] [选项] <选择>...

标记:
    -c, --character-wise    按字符编号选择字段
    -d, --debug             激活调试模式
    -x, --exclusive         使用独占范围,比如:choose -x :5(选取0到5但不包括第5个字段)
    -h, --help              打印帮助信息
    -n, --non-greedy        使用非贪婪字段分隔符
        --one-indexed       索引从 1 开始而非 0
    -V, --version           打印版本信息

选项:
    -f, --field-separator <字段分隔符>                         指定分隔符(如果不想用空格)

    -i, --input <输入>                                        输入文件
    -o, --output-field-separator <输出字段分隔符>               指定输出字段分隔符

参数:
    <选择>...       选择要打印的字段。 
                   格式:a、a:b、a..b 或 a..=b,其中 a 和 b 是整数。 a:b 包含 b(除非被 -x 覆盖),a..b 不包括 b,a..=b 包括 b。

快速开始

# 选取第 1 个字段
$ echo "choose sections from each line of files" | choose 0
choose

# 选取第 2 个字段
$ echo "choose sections from each line of files" | choose 1
sections

# 选取第 3 个字段
$ echo "choose sections from each line of files" | choose 2
from

# 将索引改为从 1 开始,而不是默认的 0。
$ echo "choose sections from each line of files" | choose --one-indexed 1
choose

# 选取第 0、2、5 个字段
$ echo "choose sections from each line of files" | choose 0 2 5
choose from of

# 选取第 2 到 5 个字段
$ echo "choose sections from each line of files" | choose 2:5
from each line of

# 选取第 0 到 5 个字段,但不包括第 5 个。
$ echo "choose sections from each line of files" | choose -x 2:5
from each line

# 选取第 0 到第 5 个字段
$ echo "choose sections from each line of files" | choose :5
choose sections from each line of

# 选取第 0 到第 5 个字段,但不包括第 5 个。
$ echo "choose sections from each line of files" | choose -x :5
choose sections from each line

# 选取第 0 到第 5 个字段,但不包括第 5 个。
$ echo "choose sections from each line of files" | choose 0..5 
choose sections from each line

# 选取第 0 到第 5 个字段,包括第 5 个。
$ echo "choose sections from each line of files" | choose 0..=5
choose sections from each line of

# 选取第 5 个开始到行尾的所有字段
$ echo "choose sections from each line of files" | choose 5:
of files

# 选取最后一个字段
$ echo "choose sections from each line of files" | choose -1
files

# 选取最后 5 个字段
$ echo "choose sections from each line of files" | choose -5:-1
from each line of files

# 效果同上
$ echo "choose sections from each line of files" | choose -5:
from each line of files

至此,你基本上已经学会了choose

使用指南

下面对 choose 的其它用法进行介绍。

1. 选取多行字段

前面都只介绍了选取一行的字段,这里再演示一下选取多行字段的效果。

例如:

$ ps | choose 0
PID
33914
25327
25342
37052
37063
90599
12021
90610
....


$ ps | choose  0 3
PID CMD
33914 /bin/zsh
25327 /bin/zsh
25342 /bin/zsh
37052 /bin/zsh
37063 /bin/zsh
90599 /bin/zsh
12021 /bin/zsh
90610 /bin/zsh
....

2. 指定字段分隔符

默认的分隔符是空格,如果想指定别的分隔符,可以使用 -f 来指定。

命令格式:

choose -f "<分隔符>" <选择>

例如:

# ps 的输出信息
$ ps
  PID TTY           TIME CMD
33914 ttys000    9:19.22 /bin/zsh (figterm)
25327 ttys001   92:44.44 /bin/zsh (figterm)
25342 ttys002    0:00.48 /bin/zsh --login
37052 ttys005   92:25.94 /bin/zsh (figterm)
37063 ttys006    0:00.44 /bin/zsh --login
...

# 我们想要获取 TIME 这一列:后面的内容
$ ps | choose 2 | choose -f ":" 1
19.22
44.44
00.48
25.94
00.44
...

3. 指定输入文件

choose 可以通过 -i 选项指定输入文件。

命令格式:

choose -i <输入文件> <选择>

例如:

# 将字符串写入文件
$ echo "choose sections from each line of files" >> test.log

# 指定输入文件,选取第1到4个字段
$ choose -i test.log 0:3
choose sections from each

4. 指定输出分隔符

choose 可以通过 -o 选项指定输出的分隔符。

命令格式:

choose -o <分隔符> <选择>

例如:

# 将字符串写入文件
$ echo "choose sections from each line of files" >> test.log

# 指定输入文件,选取第1到4个字段,并以 - 为分隔符
$ choose -i test.log 0:3 -o "-"
choose-sections-from-each

5. 选取字符

前面都是介绍选取字符串的内容,其实 choose 也支持选取字符,按编号选取就行了。

例如:

# 选取第 1 个字符
$ echo "choose sections from each line of files" | choose -c 0
c

# 选取第 2 个字符
$ echo "choose sections from each line of files" | choose -c 1
h

# 选取第 3 个字符
$ echo "choose sections from each line of files" | choose -c 2
o

# 选取第 1 到 6 个字符
$ echo "choose sections from each line of files" | choose -c 0:6
choose


# 同时选取多行的字符
$ ps | choose -c 0
3
2
2
3
....

总结

以上是关于《现代命令行工具指南》3. 选取字符:让选取字符变得轻而易举 - choose的主要内容,如果未能解决你的问题,请参考以下文章

《现代命令行工具指南》8. 备忘清单:让常用命令能够信手拈来 - navi

《现代命令行工具指南》6. 检测网络:让网络检测通过图表呈现 - gping

《现代命令行工具指南》1. 干掉进程:让干掉进程变得简单直接 - Fkill

《现代命令行工具指南》13. 查看文件:让查看文件变得赏心悦目 - bat

《现代命令行工具指南》13. 查看文件:让查看文件变得赏心悦目 - bat

《现代命令行工具指南》13. 查看文件:让查看文件变得赏心悦目 - bat