cut
cut
命令用于从文件或输入流中提取指定列或字段,是Linux文本处理的重要工具。
基本语法
cut [选项] [文件...]
主要选项
字符位置选项
-c LIST
- 按字符位置提取-b LIST
- 按字节位置提取-f LIST
- 按字段提取(需要指定分隔符)
分隔符选项
-d DELIM
- 指定字段分隔符(默认是Tab)-s
- 只显示包含分隔符的行--output-delimiter=STRING
- 指定输出分隔符
其他选项
--complement
- 输出互补的字符/字段-n
- 不分割多字节字符--help
- 显示帮助信息
位置指定格式
N
- 第N个字符/字段N-
- 从第N个到末尾N-M
- 从第N个到第M个-M
- 从开头到第M个N,M
- 第N个和第M个
使用示例
按字符位置提取
# 提取第1-3个字符
echo "hello world" | cut -c 1-3
# 输出: hel
# 提取第5个字符到末尾
echo "hello world" | cut -c 5-
# 输出: world
# 提取第1,3,5个字符
echo "hello world" | cut -c 1,3,5
# 输出: hlo
按字段提取
# 提取第2个字段(默认Tab分隔)
echo -e "name\tage\tcity" | cut -f 2
# 输出: age
# 以逗号为分隔符,提取第1,3字段
echo "name,age,city,country" | cut -d ',' -f 1,3
# 输出: name,city
# 提取/etc/passwd中的用户名和shell
cut -d ':' -f 1,7 /etc/passwd
# 输出: root:/bin/bash
处理CSV文件
# 从CSV文件提取指定列
cut -d ',' -f 2,4 data.csv
# 提取第2列到最后一列
cut -d ',' -f 2- data.csv
# 只显示包含逗号的行
cut -d ',' -s -f 1 data.csv
组合使用示例
# 显示系统中所有用户的用户名
cut -d ':' -f 1 /etc/passwd | sort
# 提取IP地址的前三段
echo "192.168.1.100" | cut -d '.' -f 1-3
# 输出: 192.168.1
# 从ps命令输出中提取进程ID
ps aux | tail -n +2 | cut -c 10-15
# 提取文件的扩展名
echo "document.txt" | cut -d '.' -f 2
# 输出: txt
与其他命令结合
# 统计每个用户的shell使用情况
cut -d ':' -f 7 /etc/passwd | sort | uniq -c
# 从日志文件中提取时间戳
cut -d ' ' -f 1-3 /var/log/messages
# 提取网络接口名称
ip addr | grep '^[0-9]' | cut -d ':' -f 2 | cut -d ' ' -f 2
# 从df命令输出提取文件系统使用率
df -h | tail -n +2 | cut -c 35-38
实际应用场景
日志分析
# 从Apache日志中提取IP地址
cut -d ' ' -f 1 /var/log/apache2/access.log
# 提取HTTP状态码
cut -d '"' -f 3 /var/log/apache2/access.log | cut -d ' ' -f 2
# 统计访问最多的IP
cut -d ' ' -f 1 /var/log/apache2/access.log | sort | uniq -c | sort -nr
系统管理
# 列出所有系统用户
cut -d ':' -f 1 /etc/passwd | head -20
# 查看用户的默认shell
cut -d ':' -f 1,7 /etc/passwd | grep bash
# 提取挂载点信息
cut -d ' ' -f 3 /proc/mounts | sort | uniq
数据处理
# 处理CSV数据,提取特定列
cut -d ',' -f 2,5,8 sales_data.csv > extracted_data.csv
# 从配置文件中提取键值
cut -d '=' -f 1 /etc/config.conf # 提取键名
cut -d '=' -f 2 /etc/config.conf # 提取值
常用技巧
1. 处理复杂分隔符
# 处理多个空格作为分隔符的情况
echo "name age city" | tr -s ' ' | cut -d ' ' -f 2
# 处理制表符和空格混合
cat file | tr '\t' ' ' | cut -d ' ' -f 1
2. 反向选择
# 排除第2列,显示其他所有列
cut --complement -f 2 data.csv
# 排除第1-3字符,显示其余字符
echo "hello world" | cut --complement -c 1-3
3. 处理包含分隔符的字段
# 当字段本身包含分隔符时,使用引号处理
cut -d '"' -f 2,4,6 data.csv # 提取引号内的内容
注意事项
- 字符编码: 处理非ASCII字符时注意使用
-n
选项 - 分隔符: 默认分隔符是Tab,不是空格
- 空行处理: cut命令会保留空行
- 字段编号: 字段编号从1开始,不是0
- 性能: 处理大文件时,cut比awk更快
相关命令
awk
- 更强大的文本处理工具sed
- 流编辑器tr
- 字符转换sort
- 排序uniq
- 去重
cut命令是Linux文本处理的基础工具,掌握其用法对日常运维工作非常重要。