Linux cut 命令:文本切割

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

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

前提条件

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

  • 对 Linux 命令行有基本的了解
  • 能够访问 Linux 终端(本实验假设你使用的是 /home/labex/project 目录中的终端)

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("`Linux`")) -.-> linux/BasicFileOperationsGroup(["`Basic File Operations`"]) linux/BasicFileOperationsGroup -.-> linux/cut("`Text Cutting`") subgraph Lab Skills linux/cut -.-> lab-219187{{"`Linux cut 命令:文本切割`"}} end

理解书店数据

让我们从检查书店数据文件开始。我们有两个文件:customers.txtbooks.txt

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

cat /home/labex/project/customers.txt

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

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

接下来,查看 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 的字段范围(包括 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 个字符

你应该会看到:

Title
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 文件中提取单个字段
  • 提取多个字段和字段范围
  • 处理固定宽度数据
  • cut 与其他命令(如 grep)结合使用

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

本实验未涵盖的 cut 命令附加参数:

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

为了进一步学习,你可以尝试使用这些附加参数,并创建自己的数据文件进行练习。记住,如果你需要更多信息,可以使用 man cut 命令查看 cut 命令的完整手册。

资源

您可能感兴趣的其他 Linux 教程