Linux 中 Cut 命令的 4 个基本实用用法Linux 中 Cut 命令的 4 个基本实用用法Linux 中 Cut 命令的 4 个基本实用用法Linux 中 Cut 命令的 4 个基本实用用法
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

Linux 中 Cut 命令的 4 个基本实用用法

Linux 中的 cut 命令允许删除文件每一行的数据。阅读本教程以了解如何有效地使用它来处理文本或 CSV 数据文件。

cut 命令是从文本文件中删除“列”的规范工具。在这种情况下,“列”可以定义为由其在行上的物理位置标识的字符或字节范围,或者由分隔符分隔的字段范围。

我之前写过有关使用 AWK 命令的文章。在这篇详细的指南中,我将解释 Linux 中 cut 命令的四个基本且实用的示例,这将对您大有帮助。

Linux中Cut命令的4个实际例子

如果您愿意,可以观看此视频,该视频解释了我在文章中列出的 cut 命令的相同实际示例。

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 命令实际上要求您指定要保留的数据范围保留,而不是您想要删除的范围。因此,如果我只需要上面数据文件中的 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 命令允许您通过用逗号分隔来指定多个范围。这里有几个例子:

# Keep characters from 1 to 24 (inclusive)
cut -c -24 BALANCE.txt

# Keep characters from 1 to 24 and 36 to 59 (inclusive)
cut -c -24,36-59 BALANCE.txt

# Keep characters from 1 to 24, 36 to 59 and 93 to the end of the line (inclusive)
cut -c -24,36-59,93- BALANCE.txt

cut 命令的一个限制(或功能,取决于您看待它的方式)是它永远不会对数据重新排序。因此,尽管以不同的顺序指定了范围,以下命令将产生与前一个命令完全相同的结果:

cut -c 93-,-24,36-59 BALANCE.txt

您可以使用 diff 命令轻松检查:

diff -s <(cut -c -24,36-59,93- BALANCE.txt) \
              <(cut -c 93-,-24,36-59 BALANCE.txt)
Files /dev/fd/63 and /dev/fd/62 are identical

同样,cut 命令从不重复数据:

# One might expect that could be a way to repeat
# the first column three times, but no...
cut -c -10,-10,-10 BALANCE.txt | head -5
ACCDOC
4
4
4
5

值得一提的是,有人提议使用 -o 选项来解除最后两个限制,允许 cut 实用程序重新排序或复制数据。但这被 POSIX 委员会拒绝了“因为这种类型的增强超出了 IEEE P1003.2b 草案标准的范围。 ”

就我自己而言,我不知道有任何削减版本将该提案作为扩展来实现。但如果您这样做,请使用评论部分与我们分享!

2. 使用字节范围

当使用-b命令行选项调用时,cut命令将删除字节范围。

乍一看,字符和字节范围之间没有明显区别:

sh$ diff -s <(cut -b -24,36-59,93- BALANCE.txt) \
              <(cut -c -24,36-59,93- BALANCE.txt)
Files /dev/fd/63 and /dev/fd/62 are identical

这是因为我的示例数据文件使用 US-ASCII 字符编码(“charset”),因为 file -i 命令可以正确猜测它:

sh$ file -i BALANCE.txt
BALANCE.txt: text/plain; charset=us-ascii

在该字符编码中,字符和字节之间存在一对一的映射。仅使用一个字节,理论上您可以编码多达 256 个不同的字符(数字、字母、标点符号、符号……)。实际上,这个数字要低得多,因为字符编码提供了一些特殊值(例如 32 或 65 个控制字符)一般都能找到)。无论如何,即使我们可以使用完整的字节范围,这也远远不足以存储人类书写的多样性。因此,如今,字符和字节之间的一对一映射更多的是例外而不是规范,并且几乎总是被无处不在的 UTF-8 多字节编码所取代。现在让我们看看 cut 命令如何处理这个问题。

使用多字节字符

正如我之前所说,用作该文章示例的样本数据文件来自我妻子使用的会计软件。它补充说,她最近更新了该软件,之后导出的文本文件略有不同。我让你尝试自己发现差异:

sh$ head BALANCE-V2.txt
ACCDOC    ACCDOCDATE    ACCOUNTNUM ACCOUNTLIB              ACCDOCLIB                        DEBIT          CREDIT
4         1012017       623477     TIDE SCHEDULE           ALNÉENRE-4701-LOC                00000001615,00
4         1012017       445452     VAT BS/ENC              ALNÉENRE-4701-LOC                00000000323,00
4         1012017       4356       PAYABLES                ALNÉENRE-4701-LOC                               00000001938,00
5         1012017       623372     ACCOMODATION GUIDE      ALNÉENRE-4771-LOC                00000001333,00
5         1012017       445452     VAT BS/ENC              ALNÉENRE-4771-LOC                00000000266,60
5         1012017       4356       PAYABLES                ALNÉENRE-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

本节的标题可能会帮助您找到更改的内容。但是,无论是否找到,现在让我们看看该更改的后果:

sh$ cut -c 93-,-24,36-59 BALANCE-V2.txt
ACCDOC    ACCDOCDATE    ACCOUNTLIB              DEBIT          CREDIT
4         1012017       TIDE SCHEDULE            00000001615,00
4         1012017       VAT BS/ENC               00000000323,00
4         1012017       PAYABLES                                00000001938,00
5         1012017       ACCOMODATION GUIDE       00000001333,00
5         1012017       VAT BS/ENC               00000000266,60
5         1012017       PAYABLES                                00000001599,60
6         1012017       PAYABLES                               00000001837,20
6         1012017       VAT BS/ENC              00000000306,20
6         1012017       TOURIST GUIDE BOOK      00000001531,00
19        1012017       SEMINAR FEES            00000000080,00
19        1012017       PAYABLES                               00000000080,00
28        1012017       MAINTENANCE             00000000746,58
28        1012017       VAT BS/ENC              00000000149,32
28        1012017       PAYABLES                               00000000895,90
31        1012017       PAYABLES                                00000000240,00
31        1012017       VAT BS/DEBIT             00000000040,00
31        1012017       ADVERTISEMENTS           00000000200,00
32        1012017       WATER                   00000000202,20
32        1012017       VAT BS/DEBIT            00000000020,22
32        1012017       WATER                   00000000170,24
32        1012017       VAT BS/DEBIT            00000000009,37
32        1012017       PAYABLES                               00000000402,03
34        1012017       RENTAL COSTS            00000000018,00
34        1012017       PAYABLES                               00000000018,00
35        1012017       MISCELLANEOUS CHARGES   00000000015,00
35        1012017       VAT BS/DEBIT            00000000003,00
35        1012017       PAYABLES                               00000000018,00
36        1012017       LANDLINE TELEPHONE        00000000069,14
36        1012017       VAT BS/ENC                00000000013,83

我已将命令输出复制到上面in-extenso,因此应该很明显列对齐出了问题。

解释是原始数据文件仅包含 US-ASCII 字符(符号、标点符号、数字和拉丁字母,没有任何变音符号)

但是,如果您仔细查看软件更新后生成的文件,您可以看到新的导出数据文件现在保留了重音字母。例如,名为“ALNÉENRE”的公司现在拼写正确,而之前导出为“ALNEENRE”(无重音)

file -i 实用程序没有错过该更改,因为它现在报告文件是 UTF-8 编码的:

sh$ file -i BALANCE-V2.txt
BALANCE-V2.txt: text/plain; charset=utf-8

要查看 UTF-8 文件中的重音字母是如何编码的,我们可以使用 hexdump 实用程序,它允许我们直接查看文件中的字节:

# To reduce clutter, let's focus only on the second line of the file
sh$ sed '2!d' BALANCE-V2.txt
4         1012017       623477     TIDE SCHEDULE           ALNÉENRE-4701-LOC                00000001615,00
sh$ sed '2!d' BALANCE-V2.txt  | hexdump -C
00000000  34 20 20 20 20 20 20 20  20 20 31 30 31 32 30 31  |4         101201|
00000010  37 20 20 20 20 20 20 20  36 32 33 34 37 37 20 20  |7       623477  |
00000020  20 20 20 54 49 44 45 20  53 43 48 45 44 55 4c 45  |   TIDE SCHEDULE|
00000030  20 20 20 20 20 20 20 20  20 20 20 41 4c 4e c3 89  |           ALN..|
00000040  45 4e 52 45 2d 34 37 30  31 2d 4c 4f 43 20 20 20  |ENRE-4701-LOC   |
00000050  20 20 20 20 20 20 20 20  20 20 20 20 20 30 30 30  |             000|
00000060  30 30 30 30 31 36 31 35  2c 30 30 20 20 20 20 20  |00001615,00     |
00000070  20 20 20 20 20 20 20 20  20 20 20 0a              |           .|
0000007c

在 hexdump 输出的第 00000030 行,在一堆空格(字节 20)之后,您可以看到:

  • 字母 A 被编码为字节 41,

  • 字母L被编码为字节4c,

  • 字母N被编码为字节4e。

但是,带 ACUTE 的大写拉丁文大写字母 E(因为它是 Unicode 标准中字母 É 的正式名称)使用 进行编码两个字节c3 89

问题是:使用 cut 命令以及以字节位置表示的范围适用于固定长度编码,但不适用于 UTF-8 或 Shift JIS 等可变长度编码。以下 POSIX 标准的非规范摘录对此进行了清楚的解释:

cut 实用程序的早期版本在字节和字符被视为等效的环境中工作(在某些实现中对 和 <tab> 进行模处理)。在多字节字符的扩展世界中,添加了新的 -b 选项。

嘿,等一下!在上面的“错误”示例中,我没有使用 -b 选项,而是使用了 -c 选项。那么,不应该这有效吗?!?

是的,它应该:这是不幸的,但我们已经在 2018 年了,尽管如此,从 GNU Coreutils 8.30 开始,cut 实用程序的 GNU 实现仍然无法处理多- 字节字符正确。引用 GNU 文档,-c 选项是“目前与 -b 相同,但国际化将改变这一点[...]” ——这个说法已经存在十多年了!

另一方面,cut 实用程序的 OpenBSD 实现符合 POSIX 标准,并且将遵循当前的区域设置以正确处理多字节字符:

# Ensure subseauent commands will know we are using UTF-8 encoded
# text files
openbsd-6.3$ export LC_CTYPE=en_US.UTF-8

# With the `-c` option, cut works properly with multi-byte characters
openbsd-6.3$ cut -c -24,36-59,93- BALANCE-V2.txt
ACCDOC    ACCDOCDATE    ACCOUNTLIB              DEBIT          CREDIT
4         1012017       TIDE SCHEDULE           00000001615,00
4         1012017       VAT BS/ENC              00000000323,00
4         1012017       PAYABLES                               00000001938,00
5         1012017       ACCOMODATION GUIDE      00000001333,00
5         1012017       VAT BS/ENC              00000000266,60
5         1012017       PAYABLES                               00000001599,60
6         1012017       PAYABLES                               00000001837,20
6         1012017       VAT BS/ENC              00000000306,20
6         1012017       TOURIST GUIDE BOOK      00000001531,00
19        1012017       SEMINAR FEES            00000000080,00
19        1012017       PAYABLES                               00000000080,00
28        1012017       MAINTENANCE             00000000746,58
28        1012017       VAT BS/ENC              00000000149,32
28        1012017       PAYABLES                               00000000895,90
31        1012017       PAYABLES                               00000000240,00
31        1012017       VAT BS/DEBIT            00000000040,00
31        1012017       ADVERTISEMENTS          00000000200,00
32        1012017       WATER                   00000000202,20
32        1012017       VAT BS/DEBIT            00000000020,22
32        1012017       WATER                   00000000170,24
32        1012017       VAT BS/DEBIT            00000000009,37
32        1012017       PAYABLES                               00000000402,03
34        1012017       RENTAL COSTS            00000000018,00
34        1012017       PAYABLES                               00000000018,00
35        1012017       MISCELLANEOUS CHARGES   00000000015,00
35        1012017       VAT BS/DEBIT            00000000003,00
35        1012017       PAYABLES                               00000000018,00
36        1012017       LANDLINE TELEPHONE      00000000069,14
36        1012017       VAT BS/ENC              00000000013,83

正如预期的那样,当使用 -b 字节模式而不是 -c 字符模式时,OpenBSD cut 实现的行为类似于旧版 cut:

openbsd-6.3$ cut -b -24,36-59,93- BALANCE-V2.txt
ACCDOC    ACCDOCDATE    ACCOUNTLIB              DEBIT          CREDIT
4         1012017       TIDE SCHEDULE            00000001615,00
4         1012017       VAT BS/ENC               00000000323,00
4         1012017       PAYABLES                                00000001938,00
5         1012017       ACCOMODATION GUIDE       00000001333,00
5         1012017       VAT BS/ENC               00000000266,60
5         1012017       PAYABLES                                00000001599,60
6         1012017       PAYABLES                               00000001837,20
6         1012017       VAT BS/ENC              00000000306,20
6         1012017       TOURIST GUIDE BOOK      00000001531,00
19        1012017       SEMINAR FEES            00000000080,00
19        1012017       PAYABLES                               00000000080,00
28        1012017       MAINTENANCE             00000000746,58
28        1012017       VAT BS/ENC              00000000149,32
28        1012017       PAYABLES                               00000000895,90
31        1012017       PAYABLES                                00000000240,00
31        1012017       VAT BS/DEBIT             00000000040,00
31        1012017       ADVERTISEMENTS           00000000200,00
32        1012017       WATER                   00000000202,20
32        1012017       VAT BS/DEBIT            00000000020,22
32        1012017       WATER                   00000000170,24
32        1012017       VAT BS/DEBIT            00000000009,37
32        1012017       PAYABLES                               00000000402,03
34        1012017       RENTAL COSTS            00000000018,00
34        1012017       PAYABLES                               00000000018,00
35        1012017       MISCELLANEOUS CHARGES   00000000015,00
35        1012017       VAT BS/DEBIT            00000000003,00
35        1012017       PAYABLES                               00000000018,00
36        1012017       LANDLINE TELEPHONE        00000000069,14
36        1012017       VAT BS/ENC                00000000013,83

3. 使用字段

从某种意义上说,对于 cut 实用程序来说,处理分隔文本文件中的字段更容易,因为它只需找到每行上的(一个字节)字段分隔符,然后逐字复制字段内容到输出而无需担心任何编码问题。

下面是一个分隔文本文件示例:

sh$ head BALANCE.csv
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;

您可能知道文件格式为 CSV(用于逗号分隔值),即使字段分隔符并不总是逗号。例如,分号 (;) 经常被用作字段分隔符,并且在已经使用逗号作为小数分隔符的国家/地区将数据导出为“CSV”时,它通常是默认选择(就像我们在法国所做的那样 - 因此在我的示例文件中选择了该字符)。另一种流行的变体使用制表符作为字段分隔符,生成有时称为制表符分隔值的文件。最后,在 Unix 和 Linux 世界中,冒号 (:) 是您可能会发现的另一种相对常见的字段分隔符,例如,在标准 /etc/passwd 和/etc/group 文件。

使用分隔文本文件格式时,您可以使用 -f 选项向 cut 命令提供要保留的字段范围,并且必须使用 -d 指定分隔符> 选项(如果没有 -d 选项,剪切实用程序默认使用制表符作为分隔符):

sh$ cut -f 5- -d';' BALANCE.csv | head
ACCDOCLIB;DEBIT;CREDIT
ALNEENRE-4701-LOC;00000001615,00;
ALNEENRE-4701-LOC;00000000323,00;
ALNEENRE-4701-LOC;;00000001938,00
ALNEENRE-4771-LOC;00000001333,00;
ALNEENRE-4771-LOC;00000000266,60;
ALNEENRE-4771-LOC;;00000001599,60
FACT FA00006253 - BIT QUIROBEN;;00000001837,20
FACT FA00006253 - BIT QUIROBEN;00000000306,20;
FACT FA00006253 - BIT QUIROBEN;00000001531,00;

处理不包含分隔符的行

但是如果输入文件中的某些行不包含分隔符怎么办?人们很容易将其想象为仅包含第一个字段的行。但这不是剪切实用程序的作用。

默认情况下,当使用 -f 选项时,剪切实用程序将始终逐字输出不包含分隔符的行(可能假设这是一个非数据行,如某种标题或注释) ):

sh$ (echo "# 2018-03 BALANCE"; cat BALANCE.csv) > BALANCE-WITH-HEADER.csv

sh$ cut -f 6,7 -d';' BALANCE-WITH-HEADER.csv | head -5
# 2018-03 BALANCE
DEBIT;CREDIT
00000001615,00;
00000000323,00;
;00000001938,00

使用 -s 选项,您可以反转该行为,因此 cut 将始终忽略此类行:

sh$ cut -s -f 6,7 -d';' BALANCE-WITH-HEADER.csv | head -5
DEBIT;CREDIT
00000001615,00;
00000000323,00;
;00000001938,00
00000001333,00;

如果您心情不好,您可以利用该功能作为一种相对晦涩的方式来仅保留包含给定字符的行:

# Keep lines containing a `e`
sh$ printf "%s\n" {mighty,bold,great}-{condor,monkey,bear} | cut -s -f 1- -d'e'

更改输出分隔符

作为扩展,cut 的 GNU 实现允许使用 --output-delimiter 选项对输出使用不同的字段分隔符:

sh$ cut -f 5,6- -d';' --output-delimiter="*" BALANCE.csv | head
ACCDOCLIB*DEBIT*CREDIT
ALNEENRE-4701-LOC*00000001615,00*
ALNEENRE-4701-LOC*00000000323,00*
ALNEENRE-4701-LOC**00000001938,00
ALNEENRE-4771-LOC*00000001333,00*
ALNEENRE-4771-LOC*00000000266,60*
ALNEENRE-4771-LOC**00000001599,60
FACT FA00006253 - BIT QUIROBEN**00000001837,20
FACT FA00006253 - BIT QUIROBEN*00000000306,20*
FACT FA00006253 - BIT QUIROBEN*00000001531,00*

请注意,在这种情况下,所有出现的字段分隔符都会被替换,而不仅仅是命令行参数上指定的范围边界处的字段分隔符。

4. 非 POSIX GNU 扩展

说到非 POSIX GNU 扩展,其中有几个可能特别有用。值得一提的是,以下扩展同样适用于字节、字符(对于当前 GNU 实现中的含义)或字段范围:--complement

将该选项想象为 sed 地址中的感叹号 (!); cut 将保留不匹配范围的数据,而不是保留与给定范围匹配的数据

# Keep only field 5
sh$ cut -f 5 -d';' BALANCE.csv |head -3
ACCDOCLIB
ALNEENRE-4701-LOC
ALNEENRE-4701-LOC

# Keep all but field 5
sh$ cut --complement -f 5 -d';' BALANCE.csv |head -3
ACCDOC;ACCDOCDATE;ACCOUNTNUM;ACCOUNTLIB;DEBIT;CREDIT
4;1012017;623477;TIDE SCHEDULE;00000001615,00;
4;1012017;445452;VAT BS/ENC;00000000323,00;

--零终止 (-z)

使用 NUL 字符作为行终止符而不是换行符。当您的数据可能包含嵌入的换行符时(例如处理文件名时),-z 选项特别有用(因为换行符是文件名中的有效字符,但 NUL 不是)。

为了向您展示 -z 选项如何工作,让我们做一个小实验。首先,我们将创建一个文件,其名称包含嵌入的换行符:

bash$ touch

现在假设我要显示每个 *.txt 文件名的前 5 个字符。一个幼稚的解决方案将在这里惨败:

sh$ ls -1 *.txt | cut -c 1-5
BALAN
BALAN
EMPTY
FILE
WITH
NAME.

您可能已经读过 ls 是为人类消费而设计的,在命令管道中使用它是一种反模式(确实如此)。因此,让我们改用 find 命令:

sh$ find . -name '*.txt' -printf "%f\n" | cut -c 1-5
BALAN
EMPTY
FILE
WITH
NAME.
BALAN

并且...产生了与之前基本相同的错误结果(尽管顺序不同,因为 ls 隐式对文件名进行排序,而 find 命令不会执行此操作)。

问题在于,在这两种情况下,cut 命令都无法区分作为数据字段(文件名)一部分的换行符和用作记录结束标记的换行符。但是,使用 NUL 字节 (\0) 作为行终止符可以消除混乱,因此我们最终可以获得预期的结果:

# I was told (?) some old versions of tr require using \000 instead of \0
# to denote the NUL character (let me know if you needed that change!)
sh$ find . -name '*.txt' -printf "%f\0" | cut -z -c 1-5| tr '\0' '\n'
BALAN
EMPTY
BALAN

通过最新的示例,我们将远离本文的核心,即 cut 命令。因此,我将让您尝试自己弄清楚 find 命令的 printf 参数后面的时髦 "%f\0" 的含义,或者为什么我在管道末尾使用 tr 命令。

使用“剪切”命令可以完成更多操作

我只是展示了 Cut 命令最常见、也是我认为最本质的用法。您可以以更实际的方式应用该命令。这取决于你的逻辑推理和想象力。

请随时使用下面的评论部分来发布您的发现。并且,一如既往,如果您喜欢这篇文章,请不要忘记在您最喜欢的网站和社交媒体上分享它!

©2015-2025 艾丽卡 support@alaica.com