概述
cut命令是文本按列/字符截取工具,核心作用是从文本文件或命令输出中,按固定字符位置、指定列(分隔符分割)提取指定内容,是处理结构化文本(CSV、日志、配置文件)的轻量高频工具,特点是简单高效、轻量快速,适合快速提取文本中的关键列/字符段。
资料合集:https://pan.quark.cn/s/6fe3007c3e95、https://pan.quark.cn/s/561de99256a5、https://pan.quark.cn/s/985f55b13d94、https://pan.quark.cn/s/d0fb20abd19a
一、核心特点
- 三种截取模式:按字符、字节、列(分隔符)截取,覆盖所有文本截取场景;
- 轻量高效:语法极简,比
awk更适合简单列/字符提取,执行速度更快; - 支持管道:可直接处理其他命令的输出(如
ls | cut、ps -ef | cut); - 仅支持单字符分隔符:列模式下分隔符只能是单个字符(如逗号、空格、竖线),不支持多字符分隔。
二、基本语法
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-c5char.txt# 输出:4、e、令# 2. 截取连续字符:1-5个字符cut-c1-5 char.txt# 输出:01234、abcde、Linux命# 3. 截取从N到末尾:第3个字符到最后cut-c3- char.txt# 输出:23456789、cdefghij、nux命令学习# 4. 截取多个不连续字符:1、3、5个字符cut-c1,3,5 char.txt# 输出:024、ace、Lnx令# 5. 反向截取:除了1-3个字符,截取剩余所有cut-c1-3 --complement char.txt# 输出:3456789、defghij、x命令学习六、按列截取
最常用的场景,处理逗号/空格/竖线分隔的结构化文本,-d指定单字符分隔符,-f指定列范围,搭配范围表示法灵活提取列。
场景1:逗号分隔的CSV文件
# 1. 截取单个列:第2列(姓名)cut-d","-f2csv.txt# 输出:姓名、张三、李四、王五# 2. 截取连续列:1-3列(ID、姓名、年龄)cut-d","-f1-3 csv.txt# 输出:ID,姓名,年龄 / 1,张三,25 / ...# 3. 截取多个不连续列:2列(姓名)+5列(薪资)cut-d","-f2,5csv.txt# 输出:姓名,薪资 / 张三,8000 / ...# 4. 反向截取:除了第4列(城市),截取所有列cut-d","-f4--complement csv.txt# 输出:ID,姓名,年龄,薪资 / 1,张三,25,8000 / ...场景2:空格分隔的文本
# 指定分隔符为空格(-d " "),截取第2列(姓名)cut-d" "-f2space.txt# 输出:张三、李四、王五场景3:处理命令输出
直接截取其他命令的输出,无需临时文件,是日常运维的高频用法:
# 1. 截取ls -l的文件权限和文件名(1列+9列,空格分隔)ls-l|cut-d" "-f1,9# 输出:-rw-r--r-- char.txt / drwxr-xr-x test_dir/# 2. 截取ps -ef的进程PID(2列)和进程名(8列后,用8-)ps-ef|cut-d" "-f2,8-# 输出:PID COMMAND / 1 /usr/lib/systemd/systemd / ...# 3. 截取ifconfig的IP地址(先过滤行,再截取字符,组合用法)ifconfigeth0|grep"inet "|cut-c14-26# 输出:192.168.1.100(不同系统字符位置可能不同)七、按字节截取
按字节数截取,英文/数字占1字节,UTF-8中文占3字节,仅适合纯英文/数字文本,中文文本使用会出现乱码(推荐用-c替代)。
# 纯英文文本:截取1-5字节(等价于1-5字符)echo"LinuxCommand"|cut-b1-5# 输出:Linux# 含中文文本:截取1-3字节(仅截取中文的第一个字节,乱码)echo"Linux命令"|cut-b1-5# 输出:Lin�(乱码,推荐用-c 1-5)八、与awk的核心区别
cut和awk都能提取文本列,二者定位不同,cut轻量简单,awk强大灵活,按需选择是关键,避免用错工具。
| 命令 | 核心优势 | 核心劣势 | 适用场景 |
|---|---|---|---|
cut | 语法极简、执行快、轻量 | 仅支持单字符分隔符、无处理逻辑、功能单一 | 简单列/字符提取(无复杂逻辑,如直接取2/3列) |
awk | 支持多字符分隔符、可加处理逻辑(判断/计算)、功能强大 | 语法稍复杂、比cut略慢 | 复杂列处理(多分隔符、列计算、条件过滤) |
经典对比示例
# 需求:提取逗号分隔的第2列(姓名)# cut:语法极简,一步到位cut-d","-f2csv.txt# awk:语法稍复杂,适合后续加处理逻辑awk-F","'{print $2}'csv.txt# 需求:提取多字符分隔的文本(如##分隔),cut无法实现,只能用awkecho"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-c1-15|sort|uniq-c# 示例2:截取系统用户的用户名(/etc/passwd冒号分隔,第1列)并排序cat/etc/passwd|cut-d":"-f1|sort# 示例3:截取ls -lh的文件大小(5列)和文件名(9列),按大小排序ls-lh|cut-d" "-f5,9|sort-h# 示例4:反向截取,过滤掉日志中的时间列(假设时间在1-20字符)catapp.log|cut-c1-20 --complement十、关键注意事项
- 分隔符限制:
-d仅支持单个字符分隔符,多字符分隔(如##、|||)需用awk替代; - 连续分隔符:
cut会将连续的分隔符视为多个分隔符(如两个空格会被识别为两个分隔符,导致列错位),需先用tr -s ' '压缩为单个分隔符:# 压缩连续空格为单个,再截取列catfile.txt|tr-s' '|cut-d" "-f2 - 中文处理:优先用
-c(字符模式),-b(字节模式)处理中文会乱码; - 制表符默认:列模式下,若不指定
-d,默认分隔符为制表符\t(不是空格); - 空行处理:会正常截取空行,若需过滤,可先用
grep -v "^$"过滤空行。
十一、总结
cut是Linux轻量文本截取神器,核心价值是用极简语法快速提取文本的列/字符,无需复杂的脚本或工具,是处理结构化文本的基础命令,其核心要点可总结为:
- 三大模式:字符
-c(通用推荐)、字节-b(纯英文)、列-f(结构化文本,配合-d); - 范围表示:单个
N、连续N-M、到末尾N-、从开头-M、不连续N,M,通用所有模式; - 反向截取:
--complement,过滤指定列/字符; - 工具边界:简单截取用
cut,复杂处理(多分隔符、条件、计算)用awk; - 经典组合:与
grep(过滤)、sort(排序)、uniq(去重)搭配,实现完整文本处理。