cut 命令 #
cut
命令用于从文件的每一行中提取部分内容。它可以按字节、字符或字段(由分隔符分隔)提取内容,是处理列式数据的有用工具。
语法 #
cut [选项] [文件...]
常用选项 #
选项 | 描述 |
---|---|
-b, --bytes=列表 |
只提取指定的字节 |
-c, --characters=列表 |
只提取指定的字符 |
-d, --delimiter=分隔符 |
使用指定的分隔符代替制表符 |
-f, --fields=列表 |
只提取指定的字段 |
-n |
与-b 一起使用时不分割多字节字符 |
--complement |
补充选择的字节、字符或字段 |
-s, --only-delimited |
不打印不包含分隔符的行 |
--output-delimiter=字符串 |
使用指定的字符串作为输出分隔符 |
-z, --zero-terminated |
以 NUL 字符而不是换行符分隔行 |
列表格式 #
列表是一个或多个由逗号分隔的数字或范围。范围的格式为:
N-
:从第 N 个到行尾N-M
:从第 N 个到第 M 个(包括 N 和 M)-M
:从第 1 个到第 M 个
常见用法 #
1. 提取特定字段 #
# 使用默认分隔符(制表符)
cut -f 1,3 file.txt
# 使用自定义分隔符
cut -d: -f 1,7 /etc/passwd
2. 提取特定字符 #
# 提取每行的前5个字符
cut -c 1-5 file.txt
# 提取每行的第1、第3和第5个字符
cut -c 1,3,5 file.txt
# 提取每行从第10个字符到结尾
cut -c 10- file.txt
3. 提取特定字节 #
# 提取每行的前10个字节
cut -b 1-10 file.txt
4. 不打印不包含分隔符的行 #
cut -d: -f 1 -s file.txt
5. 使用自定义输出分隔符 #
cut -d: -f 1,7 --output-delimiter=" - " /etc/passwd
6. 提取补充字段 #
# 提取除第1个和第3个字段外的所有字段
cut -d: -f 1,3 --complement /etc/passwd
7. 从标准输入读取 #
echo "Hello,World,Example" | cut -d, -f 2
输出:
World
与其他命令结合使用 #
1. 提取特定列并排序 #
cut -d: -f 1 /etc/passwd | sort
2. 提取并计数唯一值 #
cut -d: -f 7 /etc/passwd | sort | uniq -c
3. 提取特定列并过滤 #
cut -d, -f 2 data.csv | grep "pattern"
4. 提取多个文件的相同列 #
cut -d, -f 1,3 file1.csv file2.csv
5. 提取并转换列 #
cut -d: -f 1,3 /etc/passwd | tr ':' ','
实用示例 #
1. 提取 CSV 文件的特定列 #
cut -d, -f 1,3,5 data.csv
2. 提取用户名和 shell #
cut -d: -f 1,7 /etc/passwd
3. 提取 IP 地址的特定部分 #
echo "192.168.1.1" | cut -d. -f 1,2
输出:
192.168
4. 提取文件名(不包括路径) #
echo "/path/to/file.txt" | rev | cut -d/ -f1 | rev
或使用basename
:
basename "/path/to/file.txt"
5. 提取文件扩展名 #
echo "file.txt" | cut -d. -f2
6. 提取 HTTP 状态码 #
cut -d' ' -f9 access.log
7. 提取特定时间段的日志 #
# 提取小时和分钟
cut -c 12-16 logfile.txt
8. 提取固定宽度字段 #
# 假设文件有固定宽度的列
cut -c 1-10,12-20,22-30 fixed_width_file.txt
限制和替代方案 #
cut
命令有一些限制:
- 不能处理可变宽度的字段
- 不能基于正则表达式提取内容
- 不能重新排列字段的顺序
对于这些情况,可以考虑使用以下替代方案:
awk
:更强大的文本处理工具,可以处理可变宽度的字段sed
:基于正则表达式的流编辑器perl
或python
:提供更复杂的文本处理功能
提示 #
cut
命令默认使用制表符作为字段分隔符- 使用
-d
选项可以指定自定义分隔符 - 使用
-f
选项可以提取特定字段 - 使用
-c
选项可以提取特定字符 - 使用
-b
选项可以提取特定字节 - 在处理多字节字符(如 UTF-8 编码的非 ASCII 字符)时,
-c
和-b
的行为可能不同 - 使用
-s
选项可以忽略不包含分隔符的行 - 使用
--complement
选项可以提取补充字段 - 在处理 CSV 文件时,如果字段包含分隔符,
cut
可能无法正确处理 - 对于复杂的文本处理任务,考虑使用
awk
或其他更强大的工具