Linux cut 命令:文本剪切

LinuxBeginner
立即练习

简介

在本实验中,你将学习如何使用 Linux 中的 cut 命令从文本文件中提取并分析数据。我们将模拟一个在当地书店工作的场景,你需要处理客户和书籍信息。cut 命令将帮助你从数据文件中提取特定的列或字段,从而实现高效的数据管理和分析。

前置要求

在开始本实验之前,请确保你具备:

  • 对 Linux 命令行有基本的了解
  • 可以访问 Linux 终端(本实验假设你在 /home/labex/project 目录下操作)

了解书店数据

让我们先查看一下书店的数据文件。我们有两个文件:customers.txtbooks.txt

首先,查看 customers.txt 文件的内容:

cat /home/labex/project/customers.txt

你应该会看到类似以下的输出:

ID,Name,Age,Email
1,John Doe,25,john.doe@email.com
2,Jane Smith,35,jane.smith@email.com
3,Lily Chen,30,lily.chen@email.com
4,Andy Brown,22,andy.brown@email.com

现在,查看 books.txt 文件:

cat /home/labex/project/books.txt

输出应该如下所示:

ISBN,Title,Author,Price
978-1234567890,The Great Adventure,Alice Writer,19.99
978-2345678901,Mystery in the Woods,Bob Author,24.99
978-3456789012,Cooking Basics,Carol Chef,15.99
978-4567890123,Science Explained,David Scientist,29.99

这些文件包含逗号分隔值(CSV),其中包含客户和书籍的不同字段。

如果你没有看到预期的输出或遇到错误,请检查以下内容:

  • 确保你处于正确的目录(/home/labex/project
  • 通过运行 ls -l 验证文件是否存在
  • 如果文件丢失,你可能需要手动创建它们或联系实验管理员

提取客户姓名

了解数据后,让我们使用 cut 命令提取特定信息。首先,从 customers.txt 文件中提取客户姓名。

cut 命令使用 -d 选项指定分隔符(在本例中为逗号),并使用 -f 选项选择要显示的字段。

运行以下命令:

cut -d ',' -f 2 /home/labex/project/customers.txt

让我们解析一下这个命令:

  • cut:我们使用的命令名称
  • -d ',':指定使用逗号作为字段之间的分隔符
  • -f 2:告诉 cut 提取第二个字段
  • /home/labex/project/customers.txt:输入文件的路径

你应该会看到如下输出:

Name
John Doe
Jane Smith
Lily Chen
Andy Brown

注意,标题「Name」也被包含在内了。这是因为 cut 将标题行视为文件中的普通行。

如果你想排除标题,可以将 tail 命令与 cut 结合使用:

cut -d ',' -f 2 /home/labex/project/customers.txt | tail -n +2

这个管道命令执行了两个操作:

  1. cut 从每一行中提取第二个字段(姓名)
  2. tail -n +2 从第二行开始输出,从而跳过了标题

现在的输出应该是:

John Doe
Jane Smith
Lily Chen
Andy Brown

如果你没有看到预期的输出:

  • 仔细检查你输入的命令是否与示例完全一致
  • 确保 customers.txt 文件没有被修改
  • 尝试再次运行 cat /home/labex/project/customers.txt 以验证文件内容

提取多个字段

通常,我们需要从数据中提取多个字段。让我们从 customers.txt 文件中同时提取客户姓名和年龄。

使用以下命令:

cut -d ',' -f 2,3 /home/labex/project/customers.txt

该命令与上一个类似,但现在我们在 -f 选项中指定了两个字段:

  • -f 2,3:提取第二个和第三个字段(姓名和年龄)

你的输出应该如下所示:

Name,Age
John Doe,25
Jane Smith,35
Lily Chen,30
Andy Brown,22

正如你所见,我们可以通过在 -f 选项中用逗号分隔来指定多个字段。输出会在提取的字段之间保留原始的分隔符(逗号)。

如果你的输出不匹配:

  • 确保在 -f 选项中 2 和 3 之间包含了逗号
  • 检查 customers.txt 文件是否被篡改
  • 尝试在不使用 -d ',' 选项的情况下运行命令,看看文件是否使用了不同的分隔符

提取字段范围

cut 命令还允许我们提取字段范围。让我们从 customers.txt 文件中提取从客户 ID 到年龄的所有字段(第 1 到 3 字段)。

使用此命令:

cut -d ',' -f 1-3 /home/labex/project/customers.txt

此命令的新要点如下:

  • -f 1-3:指定从第 1 到第 3 的字段范围(包含边界)

你的输出应该如下所示:

ID,Name,Age
1,John Doe,25
2,Jane Smith,35
3,Lily Chen,30
4,Andy Brown,22

该命令提取了从 1 到 3 的字段范围。你还可以组合范围和单个字段,例如使用 -f 1-3,5 来提取第 1、2、3 和 5 个字段。

如果你没有看到预期的输出:

  • 验证在 -f 选项中 1 和 3 之间是否使用了连字符(-)
  • 确保 customers.txt 文件没有被修改
  • 尝试单独提取每个字段(例如 -f 1, -f 2, -f 3),以检查文件中是否确实存在所有字段

处理固定宽度字段

有时,数据不是由分隔符分隔的,而是按固定宽度的列排列的。cut 命令也可以处理这种情况,使用 -c 选项指定字符位置。

让我们创建一个包含固定宽度数据的新文件:

cat << EOF > /home/labex/project/inventory.txt
ISBN     Title          Quantity
1234567890The Great Adv      100
2345678901Mystery in th       75
3456789012Cooking Basi       50
4567890123Science Exp        125
EOF

此命令使用 here-document (<<EOF) 创建了一个名为 inventory.txt 的新文件,其中包含固定宽度数据。

现在,让我们使用字符位置仅提取书籍标题:

cut -c 11-25 /home/labex/project/inventory.txt

这里的新要点是:

  • -c 11-25:告诉 cut 从每一行中提取第 11 到第 25 个字符

你应该看到:

itle          Q
The Great Adv
Mystery in th
Cooking Basi
Science Exp

该命令从每一行中提取第 11 到第 25 个字符,这对应于我们固定宽度数据中的标题字段。

如果你没有得到预期的输出:

  • 确保 inventory.txt 文件创建正确(你可以使用 cat /home/labex/project/inventory.txt 进行检查)
  • 验证是否使用了正确的字符范围(11-25
  • 如果标题看起来未对齐,请尝试调整字符范围

结合其他命令使用 cut

cut 命令与其他 Linux 命令结合使用时,会变得更加强大。让我们将 cutgrep 结合使用,查找所有价格超过 20 美元的书籍并显示其标题。

运行此命令:

grep -E ',[2-9][0-9]\.[0-9]{2}$' /home/labex/project/books.txt | cut -d ',' -f 2

这个命令管道执行了两个操作:

  1. grep -E ',[2-9][0-9]\.[0-9]{2}$':使用正则表达式查找价格为 20 美元或以上的行
    • ,[2-9][0-9]\.[0-9]{2}$:匹配一个逗号,后跟一个 20 到 99 之间的数字、一个小数点以及行尾的另外两个数字
  2. cut -d ',' -f 2:从 grep 找到的行中仅提取书籍标题(第二个字段)

你应该看到类似以下的输出:

Mystery in the Woods
Science Explained

如果你没有看到预期的输出:

  • 验证 books.txt 文件是否包含正确的数据
  • 检查你是否正确输入了 grep 正则表达式
  • 尝试单独运行 grep 命令,看看它选择了哪些行
  • 确保 cut 命令正确指定了第二个字段

总结

在本实验中,你学习了如何使用 Linux 中的 cut 命令从文本文件中提取特定数据。你练习了:

  • 从 CSV 文件中提取单个字段
  • 提取多个字段和字段范围
  • 处理固定宽度数据
  • cutgrep 等其他命令结合使用

这些技能对于各种场景下的数据处理和分析都非常有价值,从管理书店库存到处理任何类型的结构化文本数据。

本实验未涵盖的其他 cut 命令参数:

  • -s:禁止输出不包含分隔符的行
  • --output-delimiter=STRING:使用 STRING 作为输出分隔符
  • --complement:对所选字节、字符或字段的集合进行补集操作

为了进一步学习,请尝试使用这些额外参数进行实验,并创建你自己的数据文件进行练习。请记住,如果你需要更多信息,man cut 命令提供了 cut 命令的完整手册。