一般认为,Linux/Unix系统的设计哲学是,提供各种灵活的组件,让用户可以通过类似搭积木的方式去组装这些组件来完成所要完成的任务。灵活性非常高,可使得用户获得极大的自由。
所以,根据Unix设计哲学设计出来的各种工具都非常小巧,因为在他们看来:小即是美(小程序易于理解、小程序易于维护、小程序消耗的系统资源较少、小程序容易与其他工具相结合)。每一个工具/程序只需专心做好一件事,然后用管道这个黏合剂将各个命令组合起来可以完成各种各样的功能。
下面我将要介绍的一些命令很多都是内置在各Linux发行版中的,都不需要额外的安装,即使安装起来也是非常简单。
- rev #将文件的每行内容以字符为单位反序{每一行的位置不变}
- tac #将文件以行为单位反序{第1行变成最后1行……}
- nl #计算行号过滤器{nl filename将会把filename文件的所有内容都输出到stdout上,但是会在每个非空行的前面加上连续的行号。如果没有filename参数,那么就操作stdin。nl命令的输出与cat -n非常相似,然而,默认情况下nl不会列出空行}
- sort #起排序作用,如果想深入了解可以通过“man sort”命令进行查看,下面会有几个小例子看着看着就会用了,实在不行在最后还有个延伸阅读的链接可以看看
- uniq #删除连续相连的重复行,一般是通过管道接在sort命令的后面,两者共同起到排序、去重的作用
- cut #从文件中提取特定域/列。这个命令与awk中使用的print $N命令很相似,不过在脚本中使用cut命令会比使用awk命令来得更直接一些。常用选项就是-d(字段定界符)和-f(域分隔符)选项。
- paste #按列进行合并,在某些特定的场合非常有用
- join #这个命令和paste命令很像。但是它具有更多的功能。它能够以一种特殊的形式来合并两个文件,这种特殊的形式本质上就是一个关联数据库的简单版本。join命令只能够操作两个文件。它可以将那些具有特定标记域(通常是一个数字标签)的行合并起来,并且将结果输出到stdout。被加入的文件应该事先根据标记域进行排序以便于能够正确的匹配。
- head / tail / more / less #比较简单,就先不多介绍了
- expand / unexpand #expand命令将会把每个tab转化为一个空格。这个命令经常用在管道中。unexpand命令起到的效果与expand命令相反
- fold
- fmt
- col
- column
- colrm
- pr
- tr
使用示例:
# cat my.md5 ff2d1296bf8fec4ed6d038cda1541d9f aa/blockIP.sh 252700d91ddb9d1cc4d8fd7907300a80 aa/delegated-apnic-latest f8595be2cb014549c5a2749e44b26153 aa/time_df.awk 81ee36494bd6885313e61992e0ee5d1e aa/calc_subnet.sh 2befccb3ee74b9540e06e9367b410f62 aa/test.sh 06e4d738c36c74f8c7d6811858ae7123 aa/404_ipList.txt # # tac my.md5 06e4d738c36c74f8c7d6811858ae7123 aa/404_ipList.txt 2befccb3ee74b9540e06e9367b410f62 aa/test.sh 81ee36494bd6885313e61992e0ee5d1e aa/calc_subnet.sh f8595be2cb014549c5a2749e44b26153 aa/time_df.awk 252700d91ddb9d1cc4d8fd7907300a80 aa/delegated-apnic-latest ff2d1296bf8fec4ed6d038cda1541d9f aa/blockIP.sh # # rev my.md5 hs.PIkcolb/aa f9d1451adc830d6de4cef8fb6921d2ff tsetal-cinpa-detageled/aa 08a0037097df8d4cc1d9bdd19d007252 kwa.fd_emit/aa 35162b44e9472a5c945410bc2eb5958f hs.tenbus_clac/aa e1d5ee0e29916e3135886db49463ee18 hs.tset/aa 26f014b7639e60e0459b47ee3bccfeb2 txt.tsiLpi_404/aa 3217ea8581186d7c8f47c63c837d4e60 # # nl my.md5 1 ff2d1296bf8fec4ed6d038cda1541d9f aa/blockIP.sh 2 252700d91ddb9d1cc4d8fd7907300a80 aa/delegated-apnic-latest 3 f8595be2cb014549c5a2749e44b26153 aa/time_df.awk 4 81ee36494bd6885313e61992e0ee5d1e aa/calc_subnet.sh 5 2befccb3ee74b9540e06e9367b410f62 aa/test.sh 6 06e4d738c36c74f8c7d6811858ae7123 aa/404_ipList.txt # # cat my.md5 | sort 06e4d738c36c74f8c7d6811858ae7123 aa/404_ipList.txt 252700d91ddb9d1cc4d8fd7907300a80 aa/delegated-apnic-latest 2befccb3ee74b9540e06e9367b410f62 aa/test.sh 81ee36494bd6885313e61992e0ee5d1e aa/calc_subnet.sh f8595be2cb014549c5a2749e44b26153 aa/time_df.awk ff2d1296bf8fec4ed6d038cda1541d9f aa/blockIP.sh # # cat my.md5 | sort -k 2 06e4d738c36c74f8c7d6811858ae7123 aa/404_ipList.txt ff2d1296bf8fec4ed6d038cda1541d9f aa/blockIP.sh 81ee36494bd6885313e61992e0ee5d1e aa/calc_subnet.sh 252700d91ddb9d1cc4d8fd7907300a80 aa/delegated-apnic-latest 2befccb3ee74b9540e06e9367b410f62 aa/test.sh f8595be2cb014549c5a2749e44b26153 aa/time_df.awk
未完待续……
《 “Linux下的一些文本处理命令的学习” 》 有 4 条评论
命令行下对文本进行查找、替换、排序、美化的操作指南
https://github.com/learnbyexample/Command-line-text-processing
关于Unix哲学17条原则的新感悟
http://www.techug.com/post/unix-17-philosophy-rule.html
`
1、模块化原则(Rule of Modularity)
2、清晰原则(Rule of Clarity)
3、和解原则(Rule of Composition)
4、分离规则(Rule of Separation)
5、简单规则(Rule of Simplicity)
6、简约规则(Rule of Parsimony)
7、透明度原则(Rule of Transparency)
8、稳健性规则(Rule of Robustness)
9、表示规则(Rule of Representation)
10、最小惊喜规则(Rule of Least Surprise)
11、沉默的规则(Rule of Silence)
12、修理规则(Rule of Repair)
13、经济规则(Rule of Economy)
14、生成规则(Rule of Generation)
15、优化规则(Rule of Optimization)
16、规则的多样性(Rule of Diversity)
17、可扩展性规则(Rule of Extensibility)
`
structured-text-tools – 可用来操纵结构化文本(CSV, XML, HTML, JSON…)的命令行工具清单
https://github.com/dbohdan/structured-text-tools
`
DSV
XML, HTML
JSON
YAML, TOML
INI
Configuration files
Bonus round: CLIs for single-file databases
`
DuckDB 作为命令行工具(英文)
https://duckdb.org/2024/06/20/cli-data-processing-using-duckdb-as-a-unix-tool.html
`
DuckDB 是一个内存数据库,本文介绍如何把它当作命令行工具,进行数据分析,取代 cut、sort、sed 等工具。
DuckDB’s CLI client is portable to many platforms and architectures. It handles CSV files conveniently and offers users the same rich SQL syntax everywhere. These characteristics make DuckDB an ideal tool to complement traditional Unix tools for data processing in the command line.
DuckDB 的 CLI 客户端可移植到多种平台和架构。它能方便地处理 CSV 文件,并在任何地方为用户提供同样丰富的 SQL 语法。这些特点使 DuckDB 成为补充传统 Unix 命令行数据处理工具的理想工具。
* Table of Contents – 目录
* The Unix Philosophy – Unix哲学
* Portability and Usability – 便携性和可用性
* Data Processing with Unix Tools and DuckDB – 使用 Unix 工具和 DuckDB 进行数据处理
__* Datasets – 数据集
__* Projecting Columns – 投影列
__* Sorting Files – 文件分类
__* Intersecting Columns – 相交立柱
__* Pasting Rows Together – 将行粘贴在一起
__* Filtering – 过滤
__* Joining Files – 连接文件
__* Replacing Strings – 字符串替换
__* Reading JSON – 读取 JSON
* Performance – 性能
* Summary – 摘要
`