Linux每日一篇 - 38 - cut
Linux文本截取神器!掌握cut命令,轻松提取文本字段,让数据处理更高效!
cut命令是什么?
cut命令是Linux中用于从文本文件的每一行中提取指定字段或字符的工具。它可以按字节、字符或字段(以分隔符分隔)来截取文本内容,是数据处理和文本分析的重要工具。
基本用法
# 按字节提取(-b选项)
cut -b 1-5 filename # 提取第1到第5字节
cut -b 1,3,5 filename # 提取第1、3、5字节
cut -b 3- filename # 提取第3字节及之后的所有字节
# 按字符提取(-c选项)
cut -c 1-10 filename # 提取第1到第10个字符
cut -c 2,5,8 filename # 提取第2、5、8个字符
cut -c 5- filename # 提取第5个字符及之后的所有字符
# 按字段提取(-f选项,配合-d指定分隔符)
cut -f 2 -d ':' filename # 按冒号分割,提取第2个字段
cut -f 1,3 -d ',' filename # 按逗号分割,提取第1和第3个字段
cut -f 2-4 -d ' ' filename # 按空格分割,提取第2到第4个字段
cut -f 3- -d ':' filename # 提取第3个字段及之后的所有字段
# 指定分隔符(-d选项)
cut -f 2 -d '|' filename # 使用竖线作为分隔符
cut -f 1 -d $'\t' filename # 使用制表符作为分隔符
实用技巧
# 提取多个不连续的字段
cut -f 1,3,5 -d ':' /etc/passwd
# 提取连续的多个字段
cut -f 2-5 -d ',' data.csv
# 从命令输出中提取特定字段
ps aux | cut -d ' ' -f 11 # 提取进程命令
df -h | cut -d ' ' -f 1 # 提取磁盘设备名
# 提取文件名和扩展名
ls -la | cut -d ' ' -f 9 # 提取文件名(需要进一步处理)
# 提取IP地址
ifconfig | grep "inet " | cut -d ' ' -f 10
# 提取用户名(从passwd文件)
cut -d ':' -f 1 /etc/passwd
# 提取用户ID
cut -d ':' -f 3 /etc/passwd
# 处理CSV文件
cut -d ',' -f 2,4,6 data.csv
# 提取特定范围的字符
echo "Hello World" | cut -c 1-5 # 输出 "Hello"
# 从路径中提取文件名
echo "/path/to/file.txt" | cut -d '/' -f 4
# 组合使用其他命令
grep "root" /etc/passwd | cut -d ':' -f 1,3,4
# 提取文件的扩展名部分
ls *.txt | cut -d '.' -f 1
常用场景
# 从passwd文件中提取信息
cut -d ':' -f 1 /etc/passwd # 用户名列表
cut -d ':' -f 1,3 /etc/passwd # 用户名和用户ID
cut -d ':' -f 5 /etc/passwd # 用户全名
# 处理日志文件
cut -d ' ' -f 1 access.log # 提取IP地址
cut -d ' ' -f 4-5 access.log # 提取请求时间和时区
cut -d ' ' -f 7 access.log # 提取请求路径
# 分析CSV数据
cut -d ',' -f 1,3 customers.csv # 提取客户名和邮箱
# 系统管理任务
ps aux | cut -d ' ' -f 1 # 提取进程用户
ps aux | cut -d ' ' -f 2 # 提取进程ID
w | cut -d ' ' -f 1 # 提取当前登录用户
# 提取特定信息
mount | cut -d ' ' -f 1 # 提取挂载的设备
df -h | cut -d ' ' -f 1,5 # 提取设备和使用率
# 从路径中提取部分
pwd | cut -d '/' -f 4 # 提取当前目录名(取决于路径深度)
# 处理网络信息
netstat -tuln | cut -d ' ' -f 7 # 提取服务名称
高级用法
# 使用多个分隔符(需要借助其他工具)
# 用awk替代cut实现复杂分割
awk -F '[,;:]' '{print $1, $3}' file.txt
# 提取变化位置的字段
# 当分隔符位置不固定时,使用awk更灵活
awk -F: '{print $1, $3}' /etc/passwd
# 条件提取
# 结合grep和cut
grep "bash" /etc/passwd | cut -d ':' -f 1
# 处理多字符分隔符
# 使用awk处理多字符分隔符
awk -F'END' '{print $1}' file.txt
# 提取字段的子串
# 先用cut提取字段,再用其他工具处理
echo "john:20:engineer" | cut -d ':' -f 1 | cut -c 1-2 # 输出 jo
# 在脚本中使用
#!/bin/bash
# 从配置文件中提取特定值
config_value=$(grep "^key=" config.conf | cut -d '=' -f 2)
# 处理表格数据
# 显示表格的特定列
cat table.txt | cut -c 1-10,20-30,40-50 # 提取1-10,20-30,40-50列
# 结合其他命令进行复杂处理
sort -t ':' -k 3,3n /etc/passwd | cut -d ':' -f 1 # 按ID排序后提取用户名
实际应用示例
# 示例1: 处理学生信息表(格式:姓名:年龄:班级:分数)
# 提取姓名和班级
cut -d ':' -f 1,3 students.txt
# 示例2: 分析网站日志
# 提取访问者IP和访问时间
cut -d ' ' -f 1,4-5 access.log
# 示例3: 处理用户列表
# 提取系统用户(UID < 1000)
awk -F: '$3 < 1000 {print $1}' /etc/passwd
# 示例4: 处理CSV文件
# 提取前3列
cut -d ',' -f 1-3 data.csv
# 示例5: 系统监控
# 提取CPU使用率
top -b -n 1 | head -5 | tail -1 | tr -s ' ' | cut -d ' ' -f 3
# 示例6: 处理程序输出
# 从df命令输出中提取使用率
df -h | grep -v "Filesystem" | tr -s ' ' | cut -d ' ' -f 5
# 示例7: 数据清洗
# 从文本中提取邮箱地址的一部分
grep "@" userlist.txt | cut -d '@' -f 1
与相关命令的配合
# cut与awk的比较和选择:
# cut适合简单的字段提取
cut -d ':' -f 1 /etc/passwd
# awk功能更强,适合复杂处理
awk -F: '$3 > 1000 {print $1}' /etc/passwd
# cut与grep的配合:
grep "root" /etc/passwd | cut -d ':' -f 1,3
# cut与sort的配合:
cut -d ':' -f 1 /etc/passwd | sort
# cut与uniq的配合:
cut -d ' ' -f 1 access.log | sort | uniq -c
# cut与tr的配合:
# 处理空格不规则的情况
cat file.txt | tr -s ' ' | cut -d ' ' -f 2
注意事项
# 1. cut按字节处理时,对于多字节字符(如中文)可能会截断字符
# 2. -d选项的分隔符只能是单个字符
# 3. 当行中字段数少于指定字段号时,cut不会输出任何内容
# 4. cut不会保留原分隔符,输出字段间以制表符分隔
# 5. 使用-c选项处理多字节字符更安全
# 6. 对于复杂的分隔符,考虑使用awk命令
# 7. 当字段位置不固定时,使用字符位置提取可能更合适
关于我
全平台同名”汪多多是只猫”,专注分享实用技术教程,让你的IT学习之路更轻松!
关注我,每天一个Linux命令,轻松入门Linux系统!