Linux 文本切割

LinuxLinuxBeginner
立即练习

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

简介

欢迎来到 Linux 文本切割实验。在这个实验中,你将学习如何使用 Linux 中的 cut 命令来提取文本文件的特定部分。cut 命令是一个强大的文本处理工具,它允许你从文件的每一行或管道数据中提取部分内容。

你将学习如何使用 cut 命令的不同选项,根据分隔符和字符位置来提取文本。当处理结构化文本文件(如 CSV 文件、日志文件或任何遵循一致格式的数据)时,这项技能特别有用。

在本实验结束时,你将能够在 Linux 环境中高效地提取和处理文本数据,这是系统管理、数据处理和自动化任务的一项基本技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/BasicFileOperationsGroup -.-> linux/cut("Text Cutting") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") subgraph Lab Skills linux/cat -.-> lab-271259{{"Linux 文本切割"}} linux/cut -.-> lab-271259{{"Linux 文本切割"}} linux/grep -.-> lab-271259{{"Linux 文本切割"}} end

理解 cut 命令的基本用法

在这一步中,你将学习 cut 命令的基本用法。Linux 中的 cut 命令用于从文件的每一行或管道数据中提取部分内容。

让我们先创建一个简单的数据文件,以便后续操作:

cd ~/project
echo "name:age:city:occupation" > data/users.txt
echo "Alice:25:New York:Engineer" >> data/users.txt
echo "Bob:30:San Francisco:Designer" >> data/users.txt
echo "Charlie:22:Chicago:Student" >> data/users.txt
echo "Diana:28:Boston:Doctor" >> data/users.txt

上述命令在 ~/project/data 目录下创建了一个名为 users.txt 的文件,其中包含五行以冒号分隔的值。

现在,让我们查看这个文件的内容:

cat data/users.txt

你应该会看到以下输出:

name:age:city:occupation
Alice:25:New York:Engineer
Bob:30:San Francisco:Designer
Charlie:22:Chicago:Student
Diana:28:Boston:Doctor

使用分隔符进行切割

使用 cut 命令最常见的方式是指定一个分隔符来提取特定的字段。基本语法如下:

cut -d'delimiter' -f fields file

其中:

  • -d 指定分隔符字符
  • -f 指定要提取的字段
  • file 是输入文件

让我们从数据文件中提取姓名(第一个字段):

cut -d':' -f1 data/users.txt

这个命令告诉 cut 命令:

  • 使用 : 作为分隔符 (-d':')
  • 提取第一个字段 (-f1)
  • 从文件 data/users.txt 中提取

你应该会看到以下输出:

name
Alice
Bob
Charlie
Diana

现在,让我们提取年龄(第二个字段):

cut -d':' -f2 data/users.txt

输出:

age
25
30
22
28

提取多个字段

你可以通过指定一个用逗号分隔的列表来提取多个字段:

cut -d':' -f1,3 data/users.txt

这将提取第一个和第三个字段(姓名和城市):

name:city
Alice:New York
Bob:San Francisco
Charlie:Chicago
Diana:Boston

提取字段范围

你还可以使用连字符来提取一个字段范围:

cut -d':' -f2-4 data/users.txt

这将提取第 2 到第 4 个字段(年龄、城市和职业):

age:city:occupation
25:New York:Engineer
30:San Francisco:Designer
22:Chicago:Student
28:Boston:Doctor

与其他命令结合使用

cut 命令可以通过管道与其他命令结合使用。例如,要提取工程师的年龄:

grep "Engineer" data/users.txt | cut -d':' -f2

输出:

25

尝试使用不同的字段组合进行实验,以熟悉这个命令。

按字符位置进行切割

除了根据分隔符切割字段外,cut 命令还可以根据字符位置提取文本。当处理固定宽度的数据格式,或者你需要从每行中提取特定字符时,这种方法非常有用。

创建固定宽度的数据

让我们创建一个包含固定宽度数据的新文件,以演示此功能:

cd ~/project
echo "ID  Name      Department  Salary" > data/employees.txt
echo "001 John      IT          75000" >> data/employees.txt
echo "002 Mary      HR          65000" >> data/employees.txt
echo "003 Steve     Sales       85000" >> data/employees.txt
echo "004 Jennifer  Marketing   70000" >> data/employees.txt

现在,让我们查看这个文件的内容:

cat data/employees.txt

你应该会看到:

ID  Name      Department  Salary
001 John      IT          75000
002 Mary      HR          65000
003 Steve     Sales       85000
004 Jennifer  Marketing   70000

按字符位置提取

要根据字符位置提取文本,请使用 -c 选项,后跟你要提取的位置。语法如下:

cut -c positions file

让我们从数据文件中提取员工 ID(前 3 个字符):

cut -c1-3 data/employees.txt

这个命令告诉 cut 从每行中提取第 1 到第 3 个字符。你应该会看到:

ID
001
002
003
004

提取特定字符

你还可以提取特定的、不连续的字符:

cut -c1,5,9 data/employees.txt

这将从每行中提取第 1、第 5 和第 9 个字符:

I N
0 J
0 M
0 S
0 J

从特定位置提取到行尾

要从某个位置提取到行尾,请在位置编号后使用连字符:

cut -c5- data/employees.txt

这将从每行的第 5 个字符提取到行尾:

Name      Department  Salary
John      IT          75000
Mary      HR          65000
Steve     Sales       85000
Jennifer  Marketing   70000

将字符位置提取与管道结合使用

你可以使用管道将 cut 命令与其他命令结合使用。例如,要从工资超过 70000 的员工中仅提取部门名称(第 13 - 22 个字符):

grep -E "[7-9][0-9]000" data/employees.txt | cut -c13-22

这应该输出:

IT
Sales

练习

尝试从员工文件中仅提取姓名(第 5 - 12 个字符):

cut -c5-12 data/employees.txt

你应该会看到:

Name
John
Mary
Steve
Jennifer

如你所见,按字符位置进行切割对于处理固定宽度的数据格式特别有用,因为在这种格式中,每行的每个字段都占用特定数量的字符。

cut 与其他文本处理工具结合使用

在这一步中,你将学习如何将 cut 命令与其他 Linux 文本处理命令结合使用,以执行更复杂的数据提取和操作任务。

创建一个 CSV 数据文件

首先,让我们创建一个 CSV(逗号分隔值)文件来进行操作:

cd ~/project
echo "Date,Product,Quantity,Price,Total" > data/sales.csv
echo "2023-01-15,Laptop,5,1200,6000" >> data/sales.csv
echo "2023-01-16,Mouse,20,25,500" >> data/sales.csv
echo "2023-01-17,Keyboard,15,50,750" >> data/sales.csv
echo "2023-01-18,Monitor,8,200,1600" >> data/sales.csv
echo "2023-01-19,Headphones,12,80,960" >> data/sales.csv

让我们查看这个文件的内容:

cat data/sales.csv

你应该会看到:

Date,Product,Quantity,Price,Total
2023-01-15,Laptop,5,1200,6000
2023-01-16,Mouse,20,25,500
2023-01-17,Keyboard,15,50,750
2023-01-18,Monitor,8,200,1600
2023-01-19,Headphones,12,80,960

cutgrep 结合使用

你可以使用 grep 查找包含特定模式的行,然后使用 cut 从这些行中提取特定字段:

grep "Laptop" data/sales.csv | cut -d',' -f3-5

这个命令首先查找所有包含 "Laptop" 的行,然后提取第 3 - 5 个字段(数量、价格和总价)。你应该会看到:

5,1200,6000

cutsort 结合使用

你可以使用 sort 根据特定字段对数据进行排序:

cut -d',' -f2,4 data/sales.csv | sort -t',' -k2nr

这个命令提取产品(第 2 个字段)和价格(第 4 个字段),然后根据价格按数字降序排序。-t',' 选项为 sort 指定分隔符,-k2 表示按第二个字段排序,n 表示按数字排序,r 表示降序。

你应该会看到:

Product,Price
Laptop,1200
Monitor,200
Headphones,80
Keyboard,50
Mouse,25

cutsed 结合使用

sed 命令是一个流编辑器,可以执行基本的文本转换。以下是一个将 cutsed 结合使用的示例:

cut -d',' -f1,2,5 data/sales.csv | sed 's/,/ - /g'

这将提取日期、产品和总价字段,然后将所有逗号替换为 " - "。你应该会看到:

Date - Product - Total
2023-01-15 - Laptop - 6000
2023-01-16 - Mouse - 500
2023-01-17 - Keyboard - 750
2023-01-18 - Monitor - 1600
2023-01-19 - Headphones - 960

cutawk 结合使用

awk 命令是一个强大的文本处理工具。以下是如何将它与 cut 结合使用:

cut -d',' -f2-4 data/sales.csv | awk -F',' 'NR > 1 {print $1 " costs $" $3 " per unit"}'

这将提取第 2 - 4 个字段(产品、数量和价格),然后使用 awk 格式化消息。NR > 1 条件跳过标题行,打印语句格式化输出。

你应该会看到:

Laptop costs $1200 per unit
Mouse costs $25 per unit
Keyboard costs $50 per unit
Monitor costs $200 per unit
Headphones costs $80 per unit

处理多个文件

你还可以将 cut 用于多个文件。让我们创建另一个文件:

echo "Category,Product,Stock" > data/inventory.csv
echo "Electronics,Laptop,15" >> data/inventory.csv
echo "Accessories,Mouse,50" >> data/inventory.csv
echo "Accessories,Keyboard,30" >> data/inventory.csv
echo "Electronics,Monitor,20" >> data/inventory.csv
echo "Accessories,Headphones,25" >> data/inventory.csv

现在,让我们从两个文件中提取产品字段:

cut -d',' -f2 data/sales.csv data/inventory.csv

你应该会看到:

Product
Laptop
Mouse
Keyboard
Monitor
Headphones
Product
Laptop
Mouse
Keyboard
Monitor
Headphones

cut 命令会处理所有文件,并按顺序输出所有结果。注意,两个文件的标题行都包含在内。

通过将 cut 与其他文本处理工具结合使用,你可以在 Linux 中高效地执行复杂的数据操作任务。

cut 命令的实际应用

在这一步中,你将探索 cut 命令在现实场景中可能遇到的一些实际应用。

分析日志文件

日志文件是文本处理工具的常见应用场景。让我们创建一个简单的 Apache 风格的访问日志文件:

cd ~/project
cat > data/access.log << EOF
192.168.1.100 - - [15/Feb/2023:10:12:01 -0500] "GET /index.html HTTP/1.1" 200 2048
192.168.1.102 - - [15/Feb/2023:10:13:25 -0500] "GET /images/logo.png HTTP/1.1" 200 4096
192.168.1.103 - - [15/Feb/2023:10:14:10 -0500] "POST /login.php HTTP/1.1" 302 1024
192.168.1.100 - - [15/Feb/2023:10:15:30 -0500] "GET /dashboard.html HTTP/1.1" 200 3072
192.168.1.104 - - [15/Feb/2023:10:16:22 -0500] "GET /css/style.css HTTP/1.1" 404 512
192.168.1.105 - - [15/Feb/2023:10:17:40 -0500] "GET /index.html HTTP/1.1" 200 2048
EOF

让我们从日志文件中提取 IP 地址(第一个字段):

cut -d' ' -f1 data/access.log

你应该会看到:

192.168.1.100
192.168.1.102
192.168.1.103
192.168.1.100
192.168.1.104
192.168.1.105

现在,让我们提取 HTTP 状态码(第九个字段):

cut -d' ' -f9 data/access.log

你应该会看到:

200
200
302
200
404
200

处理配置文件

另一个常见的应用场景是处理配置文件。让我们创建一个简单的配置文件:

cat > data/config.ini << EOF
[Database]
host=localhost
port=3306
user=dbuser
password=dbpass

[Server]
host=192.168.1.10
port=8080
maxConnections=100

[Logging]
level=INFO
file=/var/log/app.log
EOF

要提取所有参数名称(等号之前的部分):

grep -v "^\[" data/config.ini | cut -d'=' -f1

这个命令使用 grep -v "^\[" 排除节标题(以 [ 开头的行),然后使用 cut 提取 = 之前的部分。你应该会看到:

host
port
user
password
host
port
maxConnections
level
file

从 CSV 文件中提取数据用于报告

让我们创建一个更复杂的 CSV 文件来表示学生成绩:

cat > data/grades.csv << EOF
StudentID,Name,Math,Science,English,History,Average
S001,John Smith,85,92,78,88,85.75
S002,Mary Johnson,90,88,92,85,88.75
S003,Robert Davis,78,80,85,92,83.75
S004,Jennifer Lee,95,93,90,87,91.25
S005,Michael Brown,82,85,88,90,86.25
EOF

要生成一个简单的报告,显示学生姓名及其平均成绩:

tail -n +2 data/grades.csv | cut -d',' -f2,6

tail -n +2 命令跳过标题行,cut 提取姓名和平均成绩字段。你应该会看到:

John Smith,85.75
Mary Johnson,88.75
Robert Davis,83.75
Jennifer Lee,91.25
Michael Brown,86.25

要找出平均成绩高于 85 分的学生:

tail -n +2 data/grades.csv | cut -d',' -f2,6 | awk -F',' '$2 > 85 {print $1 " has an average of " $2}'

你应该会看到:

John Smith has an average of 85.75
Mary Johnson has an average of 88.75
Jennifer Lee has an average of 91.25
Michael Brown has an average of 86.25

从命令输出中提取特定列

你可以使用 cut 从命令输出中提取特定列。例如,要仅列出当前目录中的文件名和文件大小:

ls -l ~/project/data | tail -n +2 | cut -d' ' -f5,9

这个命令以长格式列出文件,跳过标题行,并提取文件大小(第五个字段)和文件名(第九个字段)。具体输出将取决于你的文件,但大致如下:

237 access.log
99 config.ini
203 employees.txt
179 grades.csv
110 inventory.csv
150 sales.csv
264 users.txt

这些示例展示了如何在各种实际场景中使用 cut 命令来提取和处理文本数据的特定部分。

总结

在本次实验中,你学习了如何使用 Linux 的 cut 命令从文件中提取文本的特定部分。你已经掌握了以下内容:

  • 使用分隔符的 cut 基本用法,从结构化文本文件中提取字段
  • 如何根据字符位置从固定宽度的数据格式中提取文本
  • cut 与其他文本处理工具(如 grepsortsedawk)结合使用,进行更复杂的数据操作
  • cut 命令在常见场景(如日志分析、配置文件处理和数据报告)中的实际应用

cut 命令是 Linux 文本处理工具包中的一个强大工具。虽然它乍一看可能很简单,但它提取文本特定部分的能力使其在许多数据处理任务中非常有价值。当通过管道与其他 Linux 命令结合使用时,它成为一个灵活而强大的文本处理系统的一部分。

一些关键要点如下:

  • 在处理结构化文本时,使用 -d 指定分隔符,使用 -f 选择字段
  • 在处理固定宽度的数据时,使用 -c 提取特定字符
  • 通过管道将 cut 与其他命令结合使用,进行更复杂的处理
  • 当数据遵循一致的格式时,cut 命令最为有效

掌握了这些技能后,你现在可以在 Linux 环境中高效地提取和处理文本数据,这对于各种管理和数据处理任务至关重要。