Contents

Linux中的Cut命令

1. 概述

Linux 提供了各种实用程序来处理文件内容和命令输出。其中一个非常有用的是 cut命令。

在本教程中,我们将了解如何使用cut命令对文件和命令输出进行切片

2. 基础

cut  命令是一个命令行实用程序,用于从文件的每一行中剪切部分。它将结果写入标准输出。

值得注意的是,它不会修改文件,而仅适用于内容的副本。

虽然通常 cut命令的输入是文件,但我们可以通过管道输出 其他命令的输出并将其用作输入

3. 按字节切片

首先,让我们看看如何按字节对文件中的数据进行切片。 假设我们有一个员工记录文件,employee_data.txt

Name	Age	Department
John Smith	36	HR
John Wayne	48	Finance
Edward King	40	Finance
Stephen Fry	50	IT

上面的各个字段由制表符分隔。

要按字节切片,我们将使用 -b或 –bytes 选项:

$ cut -b 2 employee_data.txt

这将打印文件中每一行的第二个字节:

a
o
o
d
t

在这里,我们不限于按单个字节切片。因此,我们可以从每一行中选择多个字节。

例如,我们可以使用“ , ” 分隔符同时对第 3、第 5 和第 8 个字节进行切片:

$ cut -b 3,5,8 employee_data.txt
m	e
h i
h y
wrK
eh

我们还可以使用*“ - ”*分隔符指定范围:

$ cut -b 2-5 employee_data.txt
ame 
ohn 
ohn 
dwar
teph

值得注意的是,我们可以在指定 range 时省略起始位置或结束位置。因此,“ -5 ”将选择从第一个位置到第五个位置的所有字节。并且,“ 5- ” 将选择从第 5 位到行尾的所有字节。

如上所述,除了文件,我们还可以通过管道将其他 Linux 命令的输出作为cut命令的输入:

$ echo slicing example | cut -b 3-7
icing

4. 按字符切片

对于按字符切片,我们将使用 -c或 –characters 选项。

它类似于按字节切片,只是它使用字符位置而不是字节位置

因此,如果一个字符使用多个字节,则输出将包括整个字符而不是字符中的一个字节

让我们看一个例子:

$ echo spéciale | cut -c 3
é
$ echo spéciale | cut -b 3
?
$ echo spéciale | cut -b 3,4
é

请注意*?* 由上面的第二个命令打印,因为双字节字符的第一个字节不可打印。

值得注意的是,制表符和退格键被视为一个字符。

5. 按字段切片

现在,让我们看看如何按字段对文件数据进行切片。

假设我们只想列出文件中所有员工的姓名。我们可以通过使用*-f–fields*选项按文件中的第一个字段对文件数据进行切片来做到这一点:

$ cut -f 1 employee_data.txt

在这里,我们使用 了cut命令的*-f*  选项, 并使用1作为字段编号对输入进行了切片:

Name
John Smith
John Wayne
Edward King
Stephen Fry

上面,我们假设文件中的字段使用制表符分隔。但是,我们可以通过使用*-d–delimiter*选项来指定不同的分隔符来覆盖此行为:

$ cut -d " " -f 2 employee_data.txt

在这里,我们使用 -d选项将空格指定为分隔符。此外,我们正在使用字段编号 2对数据进行切片。

现在,让我们看看输出:

Smith	36	HR
Wayne	48	Finance
King	40	Finance
Fry	50	IT

值得注意的是,输出包括前面第一个字段的一部分和所有其余字段。这是因为制表符现在被视为任何其他字符,并且在任何其他字段中都没有空格。同样,第一行是空白的,因为它不包含任何空格。

与其他选项一样,我们可以使用*“ , ”* 分隔符选择多个字段:

$ cut -f 1,3 employee_data.txt
Name    Department
John Smith      HR
John Wayne      Finance
Edward King     Finance
Stephen Fry     IT

而且,我们可以使用*“ - ”*分隔符选择一系列字段:

$ cut -f 2- employee_data.txt
Age     Department
36      HR
48      Finance
40      Finance
50      IT

上述命令将从第二个字段开始输出所有字段。 默认情况下,cut命令打印输入中的所有行,即使分隔符不存在。但是,我们可以使用*-s*或 –only-delimited来改变这种行为。使用这个选项,我们可以告诉 cut命令不要打印没有分隔符的行。

6. 其他选项

现在,让我们看看可以与上述切片方法一起使用的其他选项。

当我们使用*“ , ”*来指定多个字节/字符/字段时,cut命令连接输出而不使用分隔符。但是,我们可以使用 –output-delimiter选项添加自定义分隔符:

$ echo slicing example | cut -c 2-5,9,11-13 --output-delimiter=@

这将在输出的每个部分之间添加分隔符*“ @ ”* :

lici@e@amp

另一个有趣的选项是 –complement。这将打印除指定位置的内容之外的所有内容。

让我们看一个例子:

$ echo slicing example | cut -c 5-10 --complement
slicample

正如我们所见,输出包括除了位置 5 和 10 之间的所有字符。