Linux 命令:cut

概述

cut 命令是文本按列/字符截取工具,核心作用是从文本文件或命令输出中,按固定字符位置指定列(分隔符分割)提取指定内容,是处理结构化文本(CSV、日志、配置文件)的轻量高频工具,特点是简单高效、轻量快速,适合快速提取文本中的关键列/字符段。

资料合集:https://pan.quark.cn/s/6fe3007c3e95https://pan.quark.cn/s/561de99256a5https://pan.quark.cn/s/985f55b13d94https://pan.quark.cn/s/d0fb20abd19a

一、核心特点

  1. 三种截取模式:按字符字节(分隔符)截取,覆盖所有文本截取场景;
  2. 轻量高效:语法极简,比awk更适合简单列/字符提取,执行速度更快;
  3. 支持管道:可直接处理其他命令的输出(如ls | cutps -ef | cut);
  4. 仅支持单字符分隔符:列模式下分隔符只能是单个字符(如逗号、空格、竖线),不支持多字符分隔。

二、基本语法

cut [选项] [文件]
  • 无文件时,默认读取标准输入(管道常用);
  • 核心是选项指定截取模式,三种模式互斥(一次只能用一种)。

三、核心选项

cut 的选项围绕三种截取模式设计,搭配-f/-c/-b指定截取范围,-d指定列分隔符,是整个命令的核心,高频选项仅5个,易记易用。

🔹 核心截取模式
选项模式作用适用场景
-c N字符模式字符位置截取(中文/英文均按1个字符算)固定字符长度的文本(如固定格式的日志、编码串)
-b N字节模式字节位置截取(英文1字节,中文UTF-8占3字节)处理纯英文文本/需要按字节精准截取的场景
-f N列模式截取(需配合-d指定分隔符)结构化文本(CSV、空格/逗号分隔的表格、日志)
🔹 辅助选项
选项作用搭配场景
-d "字符"指定列分隔符(默认制表符\t仅配合-f(列模式)使用
--complement反向截取:截取除指定范围外的所有内容所有模式均可使用(过滤指定列/字符)
🔹 范围表示法

N可以是单个数字、范围或多个值,支持以下写法(所有模式通用):

  • N:单个值,如-c 5(第5个字符)、-f 2(第2列);
  • N-M:连续范围,如-c 1-5(1-5个字符)、-f 2-4(2-4列);
  • N-:从N到末尾,如-c 3-(第3个字符到最后)、-f 1-(第1列到最后);
  • -M:从开头到M,如-c -5(1-5个字符)、-f -3(1-3列);
  • N,M:多个不连续值,如-c 1,3,5(1、3、5个字符)、-f 1,3(1、3列)。

四、经典实操示例

准备测试文件
# 1. 固定字符文本:char.txt(用于-c/-b模式)
0123456789
abcdefghij
Linux命令学习

# 2. 结构化列文本:csv.txt(逗号分隔,用于-f/-d模式)
ID,姓名,年龄,城市,薪资
1,张三,25,北京,8000
2,李四,30,上海,15000
3,王五,28,广州,10000

# 3. 空格分隔文本:space.txt(用于-f/-d模式,默认分隔符为\t,空格需手动指定)
1 张三 25 北京 8000
2 李四 30 上海 15000
3 王五 28 广州 10000

五、按字符截取

中文/英文/数字均按1个字符计算,适合固定字符长度的文本截取,是最通用的截取模式(推荐优先使用)。

# 1. 截取单个字符:第5个字符
cut -c 5 char.txt
# 输出:4、e、令

# 2. 截取连续字符:1-5个字符
cut -c 1-5 char.txt
# 输出:01234、abcde、Linux命

# 3. 截取从N到末尾:第3个字符到最后
cut -c 3- char.txt
# 输出:23456789、cdefghij、nux命令学习

# 4. 截取多个不连续字符:1、3、5个字符
cut -c 1,3,5 char.txt
# 输出:024、ace、Lnx令

# 5. 反向截取:除了1-3个字符,截取剩余所有
cut -c 1-3 --complement char.txt
# 输出:3456789、defghij、x命令学习

六、按列截取

最常用的场景,处理逗号/空格/竖线分隔的结构化文本,-d指定单字符分隔符-f指定列范围,搭配范围表示法灵活提取列。

场景1:逗号分隔的CSV文件
# 1. 截取单个列:第2列(姓名)
cut -d "," -f 2 csv.txt
# 输出:姓名、张三、李四、王五

# 2. 截取连续列:1-3列(ID、姓名、年龄)
cut -d "," -f 1-3 csv.txt
# 输出:ID,姓名,年龄 / 1,张三,25 / ...

# 3. 截取多个不连续列:2列(姓名)+5列(薪资)
cut -d "," -f 2,5 csv.txt
# 输出:姓名,薪资 / 张三,8000 / ...

# 4. 反向截取:除了第4列(城市),截取所有列
cut -d "," -f 4 --complement csv.txt
# 输出:ID,姓名,年龄,薪资 / 1,张三,25,8000 / ...
场景2:空格分隔的文本
# 指定分隔符为空格(-d " "),截取第2列(姓名)
cut -d " " -f 2 space.txt
# 输出:张三、李四、王五
场景3:处理命令输出

直接截取其他命令的输出,无需临时文件,是日常运维的高频用法:

# 1. 截取ls -l的文件权限和文件名(1列+9列,空格分隔)
ls -l | cut -d " " -f 1,9
# 输出:-rw-r--r-- char.txt / drwxr-xr-x test_dir/

# 2. 截取ps -ef的进程PID(2列)和进程名(8列后,用8-)
ps -ef | cut -d " " -f 2,8-
# 输出:PID COMMAND / 1 /usr/lib/systemd/systemd / ...

# 3. 截取ifconfig的IP地址(先过滤行,再截取字符,组合用法)
ifconfig eth0 | grep "inet " | cut -c 14-26
# 输出:192.168.1.100(不同系统字符位置可能不同)

七、按字节截取

字节数截取,英文/数字占1字节,UTF-8中文占3字节,仅适合纯英文/数字文本,中文文本使用会出现乱码(推荐用-c替代)。

# 纯英文文本:截取1-5字节(等价于1-5字符)
echo "LinuxCommand" | cut -b 1-5
# 输出:Linux

# 含中文文本:截取1-3字节(仅截取中文的第一个字节,乱码)
echo "Linux命令" | cut -b 1-5
# 输出:Lin�(乱码,推荐用-c 1-5)

八、与awk的核心区别

cutawk都能提取文本列,二者定位不同,cut轻量简单,awk强大灵活,按需选择是关键,避免用错工具。

命令核心优势核心劣势适用场景
cut语法极简、执行快、轻量仅支持单字符分隔符、无处理逻辑、功能单一简单列/字符提取(无复杂逻辑,如直接取2/3列)
awk支持多字符分隔符、可加处理逻辑(判断/计算)、功能强大语法稍复杂、比cut略慢复杂列处理(多分隔符、列计算、条件过滤)
经典对比示例
# 需求:提取逗号分隔的第2列(姓名)
# cut:语法极简,一步到位
cut -d "," -f 2 csv.txt

# awk:语法稍复杂,适合后续加处理逻辑
awk -F "," '{print $2}' csv.txt

# 需求:提取多字符分隔的文本(如##分隔),cut无法实现,只能用awk
echo "1##张三##25" | awk -F "##" '{print $2}'
# 输出:张三(cut -d "##" 会报错,因为-d仅支持单字符)

结论简单列/字符提取用cut(高效快捷);复杂列处理(多分隔符、条件、计算)用awk(灵活强大)。

九、高频组合用法

cut 常与grep(过滤行)、sort(排序)、uniq(去重)组合,实现「过滤行→提取列→排序→去重」的完整文本处理流程,是日常运维/日志分析的经典搭配。

# 示例1:分析Nginx日志,提取访问IP并统计出现次数(grep+cut+sort+uniq)
grep -o "\b[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\b" access.log | cut -c 1-15 | sort | uniq -c

# 示例2:截取系统用户的用户名(/etc/passwd冒号分隔,第1列)并排序
cat /etc/passwd | cut -d ":" -f 1 | sort

# 示例3:截取ls -lh的文件大小(5列)和文件名(9列),按大小排序
ls -lh | cut -d " " -f 5,9 | sort -h

# 示例4:反向截取,过滤掉日志中的时间列(假设时间在1-20字符)
cat app.log | cut -c 1-20 --complement

十、关键注意事项

  1. 分隔符限制-d 仅支持单个字符分隔符,多字符分隔(如##|||)需用awk替代;
  2. 连续分隔符cut 会将连续的分隔符视为多个分隔符(如两个空格会被识别为两个分隔符,导致列错位),需先用tr -s ' '压缩为单个分隔符:
    # 压缩连续空格为单个,再截取列
    cat file.txt | tr -s ' ' | cut -d " " -f 2
    
  3. 中文处理:优先用-c(字符模式),-b(字节模式)处理中文会乱码;
  4. 制表符默认:列模式下,若不指定-d,默认分隔符为制表符\t(不是空格);
  5. 空行处理:会正常截取空行,若需过滤,可先用grep -v "^$"过滤空行。

十一、总结

cutLinux轻量文本截取神器,核心价值是用极简语法快速提取文本的列/字符,无需复杂的脚本或工具,是处理结构化文本的基础命令,其核心要点可总结为:

  1. 三大模式:字符-c(通用推荐)、字节-b(纯英文)、列-f(结构化文本,配合-d);
  2. 范围表示:单个N、连续N-M、到末尾N-、从开头-M、不连续N,M,通用所有模式;
  3. 反向截取--complement,过滤指定列/字符;
  4. 工具边界:简单截取用cut,复杂处理(多分隔符、条件、计算)用awk
  5. 经典组合:与grep(过滤)、sort(排序)、uniq(去重)搭配,实现完整文本处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值