LOADING...

加载中请稍等...

loading

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系统!

头像
汪多多是只猫
失业的运维工程师
热爱开源与分享
微信公众号