
在 Linux 运维、日志分析、数据清洗、脚本自动化场景中文本处理是高频核心操作。相比于复杂的文件读写编程Shell 内置文本命令可以一行代码完成数据截取、筛选、替换、格式化输出极大提升工作效率。本文聚焦cut、sed、awk三大神器从 Shell 基础语法、命令参数、实战案例、场景对比、避坑要点全面讲解所有示例可直接复制上机执行。一、前置Shell 基础语法规则所有 Linux 文本命令都依赖 Shell 语法执行掌握核心通用规则才能灵活适配各类命令避免语法报错。1.1 基本执行语法# 格式1命令 参数 目标文件 命令 [可选参数] 目标文件 # 格式2管道联动核心常用 数据来源命令 | 处理命令 [参数]1.2 核心通用规则管道符|将前一条命令的输出结果作为后一条命令的输入实现多命令联动处理数据空格分隔命令、参数、文件、符号之间必须用空格分隔严格区分格式引号规则单引号纯文本原样输出双引号可解析变量、特殊符号注释符号#开头内容为注释不执行常用于脚本备注1.3 文本处理核心逻辑Linux 文本处理统一遵循逐行读取、匹配处理、输出结果的逻辑cut、sed、awk 均基于该逻辑工作区别仅在于处理精度和功能复杂度。二、Cut 命令轻量级文本切片工具cut 是 Linux 内置的简单列截取工具核心作用是对结构化文本分隔符固定的文本按字符、字节、字段进行切片提取语法简单、执行高效适合简单的数据截取场景。2.1 命令核心语法cut [选项] 文件名/管道输入数据2.2 高频核心选项选项作用说明使用场景-f指定截取的字段列核心参数截取文本指定列数据支持多列、连续列-d自定义列分隔符默认制表符 \t适配逗号、冒号、空格等分隔的文本-c按字符位置截取固定长度文本截取如手机号、ID 截取-b按字节位置截取中英文混合、字节级精准截取--complement反向截取取指定字段之外的内容排除指定列保留剩余数据2.3 实操案例准备测试文件test.txt内容如下冒号分隔模拟用户数据root:0:admin:rootlinux.com mysql:1001:service:mysqllinux.com nginx:1002:web:nginxlinux.com案例 1按分隔符截取单列提取所有用户名# -d: 指定分隔符为冒号-f1 截取第1列 cut -d: -f1 test.txt输出结果root、mysql、nginx案例 2截取多列用户名 ID# 截取第1、2列逗号分隔多字段 cut -d: -f1,2 test.txt案例 3截取连续列# 截取1-3列所有内容 cut -d: -f1-3 test.txt案例 4按字符截取截取每行前 5 个字符cut -c1-5 test.txt案例 5反向截取排除第 4 列邮箱字段cut -d: -f4 --complement test.txt2.4 Cut 命令优缺点总结优点语法极简、执行速度快、资源占用低适合简单结构化文本截取。缺点不支持模糊匹配、条件判断、正则匹配无法处理不规则空格分隔的文本功能局限性大。三、Sed 命令流式文本编辑器sed全称 stream editor流式编辑器。核心定位对文本做增、删、改、替换。一句话区分cut 用来 “摘”awk 用来 “分析、统计”sed 用来 “修改 / 替换”。 sed 不会默认修改原文件默认只输出处理后的结果到标准输出需要加参数才会原位修改文件。3.1 sed 基础语法sed [选项] 匹配规则/动作 filename常用选项选项说明-n只输出匹配到的行默认会输出所有行常用-i直接修改原文件生产慎用可加-i.bak自动备份原文件-e多条编辑命令多个处理规则-r / -E启用扩展正则表达式不用大量转义符替换语法模板s/旧内容/新内容/修饰符修饰符g全局替换i忽略大小写3.2 实战示例沿用 test.txtroot:0:admin:rootlinux.com mysql:1001:service:mysqllinux.com nginx:1002:web:nginxlinux.com示例 1文本替换把 root 替换成 superrootsed s/root/superroot/ test.txt # 全局替换一行内所有匹配都替换加g sed s/root/superroot/g test.txt示例 2只打印匹配的行-n p# 只输出包含nginx的那一行 sed -n /nginx/p test.txt示例 3删除行 d# 删除包含mysql的行输出到屏幕原文件不变 sed /mysql/d test.txt # 删除空行 sed /^$/d test.txt示例 4追加、插入文本# 匹配root行在该行下面追加一行文字 sed /root/a new_line:test test.txt # 在root行上面插入一行 sed /root/i insert_line:before_root test.txt示例 5整行替换 c# 找到nginx这一行直接替换整行 sed /nginx/c nginx:1002:web:nginxnewdomain.com test.txt示例 6原位修改文件 备份生产推荐# -i.bak 会把原文件备份为 test.txt.bak再修改原文件 sed -i.bak s/linux.com/newlinux.com/g test.txt⚠️ 重要提醒直接sed -i xxx file无备份一旦改错无法恢复生产环境优先用-i.bak。示例 7多规则联合 -e# 先替换root再删除mysql行 sed -e s/root/superroot/g -e /mysql/d test.txt3.3 sed 适用场景与局限✅ 适合日志内容替换、批量修改配置、删除空行 / 注释行、批量增删文本、流水线预处理。 ❌ 不适合复杂多字段统计、数值计算交给 awk简单列截取交给 cut。四、Awk 命令全能文本分析编程语言awk 是 Linux最强大的文本处理工具本质是一门轻量化脚本语言支持逐行扫描文本、正则匹配、条件判断、循环计算、变量定义、格式化输出被称为「文本处理的瑞士军刀」。 如果说 cut 是「切片工具」sed 是「文本修改器」awk 就是「文本处理器」可覆盖 90% 以上的日志分析、数据清洗场景。4.1 Awk 核心工作流程awk 处理文本分为三步固定执行逻辑BEGIN 阶段读取文本前执行用于初始化变量、打印表头逐行处理阶段逐行读取文本匹配规则、执行对应动作核心阶段END 阶段文本读取完毕后执行用于统计汇总、打印结尾信息4.2 基础语法结构awk BEGIN{初始化动作} 匹配规则{执行动作} END{收尾动作} 文件名4.3 核心内置变量内置变量作用说明$0代表当前读取的整行文本$1、$2...$n代表当前行的第 1、2、n 个字段列NF当前行的字段总数总列数NR当前读取的行号FS输入字段分隔符默认空格 / 制表符OFS输出字段分隔符默认空格4.4 高频参数与实操案例沿用test.txt测试文件统一演示场景。案例 1基础列截取替代 cut提取用户名和用户 ID# -F: 指定分隔符为冒号打印第1、2列 awk -F: {print $1,$2} test.txt案例 2自定义输出分隔符格式化输出# 输出内容用【---】分隔 awk -F: {print $1,---,$4} test.txt案例 3条件筛选精准过滤数据# 筛选ID大于1000的用户数值判断 awk -F: $21000 {print $1,$2} test.txt # 模糊匹配筛选包含nginx的行 awk /nginx/ {print $0} test.txt案例 4结合 BEGINEND 做数据统计awk -F: BEGIN{print 用户名\t用户ID} {print $1,$2} END{print 总计用户数NR} test.txt案例 5处理不规则空格文本cut 无法实现 面对多空格分隔的日志文本cut 无法精准分割awk 默认自动忽略连续空格完美适配# 查看系统登录日志提取用户和登录IP last | awk {print $1,$3}案例 6进阶字段计算# 统计所有用户ID总和 awk -F: {sum$2} END{print ID总和sum} test.txt4.5 Awk 核心优势支持不规则文本处理自动适配多空格、特殊分隔符内置条件判断、数值计算、正则匹配功能全面支持自定义变量、格式化输出可生成规范报表逐行处理数据超大文件不会占用过多内存五、三大命令场景选型对比使用场景优先选择原因固定分隔符、简单列 / 字符截取cut语法简洁速度最快文本替换、批量修改配置、增删行sed流式替换擅长内容修改不规则空格、多分隔符、条件筛选、统计求和、报表输出awk内置变量、计算能力功能最强简单正则匹配输出行sed/awk 均可sed 适合只过滤awk 需要取字段选 awk六、Shell 文本处理高频组合用法实际工作中cut/sed/awk/grep/sort/uniq经常管道串联处理复杂日志。6.1 筛选日志 截取字段 去重统计# 统计系统所有登录用户去重输出 last | grep -v ^$ | awk {print $1} | sort | uniq6.2 过滤 nginx 配置去掉注释空行sed 经典场景# 删除注释行、空行输出有效配置 sed -e /^#/d -e /^$/d /etc/nginx/nginx.conf6.3 组合sed 替换 awk 筛选 cut 截取# 先替换域名筛选ID1000的用户只取用户名 sed s/linux.com/domain.com/g test.txt | awk -F: $21000 | cut -d: -f1七、常见报错与避坑指南cut 分隔符失效多空格文本不要用 cut优先 awkcut 仅支持单一固定分隔符awk 无输出结果检查分隔符是否匹配、条件判断符号是否正确awk 匹配规则和动作必须包裹在单引号内sed -i 直接修改文件不带备份-i会直接覆盖文件生产务必-i.bakMacOS 的 sed 和 GNU sed 参数有差异sed 替换分隔符当内容包含/如 url、路径可以改用#作为分隔符例如s#/usr#/opt#g避免转义sed s#/usr/local#/opt/local#g test.txt引号sed/awk 脚本用单引号双引号会让 shell 提前解析变量容易出现意外问题