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 的字段范围(包含 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 文档(<<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 与其他命令结合使用

当与其他 Linux 命令结合使用时,cut 命令会变得更加强大。让我们将 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:使用指定的字符串作为输出分隔符
  • --complement:补全选定的字节、字符或字段集(即提取未被选中的部分)

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