cut
命令是用来从文本文件中移除“某些列”的经典工具。在本文中的“一列”可以被定义为按照一行中位置区分的一系列字符串或者字节,或者是以某个分隔符为间隔的某些域。
先前我已经介绍了如何使用 AWK 命令。在本文中,我将解释 linux 下 cut
命令的 4 个本质且实用的例子,有时这些例子将帮你节省很多时间。
Linux 下 cut 命令的 4 个实用示例
假如你想,你可以观看下面的视频,视频中解释了本文中我列举的 cut 命令的使用例子。
- https://www.youtube.com/PhE_cFLzVFw
1、 作用在一系列字符上
当启用 -c
命令行选项时,cut
命令将移除一系列字符。
和其他的过滤器类似, cut
命令不会直接改变输入的文件,它将复制已修改的数据到它的标准输出里去。你可以通过重定向命令的结果到一个文件中来保存修改后的结果,或者使用管道将结果送到另一个命令的输入中,这些都由你来负责。
假如你已经下载了上面视频中的示例测试文件,你将看到一个名为 BALANCE.txt
的数据文件,这些数据是直接从我妻子在她工作中使用的某款会计软件中导出的:
sh$ head BALANCE.txt
ACCDOC ACCDOCDATE ACCOUNTNUM ACCOUNTLIB ACCDOCLIB DEBIT CREDIT
4 1012017 623477 TIDE SCHEDULE ALNEENRE-4701-LOC 00000001615,00
4 1012017 445452 VAT BS/ENC ALNEENRE-4701-LOC 00000000323,00
4 1012017 4356 PAYABLES ALNEENRE-4701-LOC 00000001938,00
5 1012017 623372 ACCOMODATION GUIDE ALNEENRE-4771-LOC 00000001333,00
5 1012017 445452 VAT BS/ENC ALNEENRE-4771-LOC 00000000266,60
5 1012017 4356 PAYABLES ALNEENRE-4771-LOC 00000001599,60
6 1012017 4356 PAYABLES FACT FA00006253 - BIT QUIROBEN 00000001837,20
6 1012017 445452 VAT BS/ENC FACT FA00006253 - BIT QUIROBEN 00000000306,20
6 1012017 623795 TOURIST GUIDE BOOK FACT FA00006253 - BIT QUIROBEN 00000001531,00
上述文件是一个固定宽度的文本文件,因为对于每一项数据,都使用了不定长的空格做填充,使得它看起来是一个对齐的列表。
这样一来,每一列数据开始和结束的位置都是一致的。从 cut
命令的字面意思去理解会给我们带来一个小陷阱:cut
命令实际上需要你指出你想保留的数据范围,而不是你想移除的范围。所以,假如我只需要上面文件中的 ACCOUNTNUM
和 ACCOUNTLIB
列,我需要这么做:
sh$ cut -c 25-59 BALANCE.txt | head
ACCOUNTNUM ACCOUNTLIB
623477 TIDE SCHEDULE
445452 VAT BS/ENC
4356 /accountPAYABLES
623372 ACCOMODATION GUIDE
445452 VAT BS/ENC
4356 PAYABLES
4356 PAYABLES
445452 VAT BS/ENC
623795 TOURIST GUIDE BOOK
范围如何定义?
正如我们上面看到的那样, cut
命令需要我们特别指定需要保留的数据的范围。所以,下面我将更正式地介绍如何定义范围:对于 cut
命令来说,范围是由连字符(-
)分隔的起始和结束位置组成,范围是基于 1 计数的,即每行的第一项是从 1 开始计数的,而不是从 0 开始。范围是一个闭区间,开始和结束位置都将包含在结果之中,正如它们之间的所有字符那样。如果范围中的结束位置比起始位置小,则这种表达式是错误的。作为快捷方式,你可以省略起始或结束值,正如下面的表格所示:
范围 | 含义 |
---|---|
a-b |
a 和 b 之间的范围(闭区间) |
a |
与范围 a-a 等价 |
-b |
与范围 1-a 等价 |
b- |
与范围 b-∞ 等价 |
cut
命令允许你通过逗号分隔多个范围,下面是一些示例:
# 保留 1 到 24 之间(闭区间)的字符
cut -c -24 BALANCE.txt
# 保留 1 到 24(闭区间)以及 36 到 59(闭区间)之间的字符
cut -c -24,36-59 BALANCE.txt
# 保留 1 到 24(闭区间)、36 到 59(闭区间)和 93 到该行末尾之间的字符
cut -c -24,36-59,93- BALANCE.txt
cut
命令的一个限制(或者是特性,取决于你如何看待它)是它将 不会对数据进行重排。所以下面的命令和先前的命令将产生相同的结果,尽管范围的顺序做了改变:
cut -c 93-,-24,36-59 BALANCE.txt
你可以轻易地使用 diff
命令来验证:
diff -s