☰
Linux 三大文本处理神器:cut sed awk 从基础到实战
2026/10/5 2:39:47 网站建设 项目流程

在 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:root@linux.com mysql:1001:service:mysql@linux.com nginx:1002:web:nginx@linux.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.txt

2.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.txt)

root:0:admin:root@linux.com mysql:1001:service:mysql@linux.com nginx:1002:web:nginx@linux.com
示例 1:文本替换,把 root 替换成 superroot
sed '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:nginx@newdomain.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.txt

3.3 sed 适用场景与局限

✅ 适合:日志内容替换、批量修改配置、删除空行 / 注释行、批量增删文本、流水线预处理。 ❌ 不适合:复杂多字段统计、数值计算(交给 awk);简单列截取(交给 cut)。

四、Awk 命令:全能文本分析编程语言

awk 是 Linux最强大的文本处理工具,本质是一门轻量化脚本语言,支持逐行扫描文本、正则匹配、条件判断、循环计算、变量定义、格式化输出,被称为「文本处理的瑞士军刀」。 如果说 cut 是「切片工具」,sed 是「文本修改器」,awk 就是「文本处理器」,可覆盖 90% 以上的日志分析、数据清洗场景。

4.1 Awk 核心工作流程

awk 处理文本分为三步,固定执行逻辑:

  1. BEGIN 阶段:读取文本前执行,用于初始化变量、打印表头
  2. 逐行处理阶段:逐行读取文本,匹配规则、执行对应动作(核心阶段)
  3. 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: '$2>1000 {print $1,$2}' test.txt # 模糊匹配(筛选包含nginx的行) awk '/nginx/ {print $0}' test.txt
案例 4:结合 BEGIN&END 做数据统计
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.txt

4.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 | uniq

6.2 过滤 nginx 配置,去掉注释空行(sed 经典场景)

# 删除注释行、空行,输出有效配置 sed -e '/^#/d' -e '/^$/d' /etc/nginx/nginx.conf

6.3 组合:sed 替换 + awk 筛选 + cut 截取

# 先替换域名,筛选ID>1000的用户,只取用户名 sed 's/linux.com/domain.com/g' test.txt | awk -F: '$2>1000' | cut -d: -f1

七、常见报错与避坑指南

  1. cut 分隔符失效:多空格文本不要用 cut,优先 awk,cut 仅支持单一固定分隔符
  2. awk 无输出结果:检查分隔符是否匹配、条件判断符号是否正确,awk 匹配规则和动作必须包裹在单引号内
  3. sed -i 直接修改文件:不带备份-i会直接覆盖文件,生产务必-i.bak;MacOS 的 sed 和 GNU sed 参数有差异
  4. sed 替换分隔符:当内容包含/(如 url、路径),可以改用#作为分隔符,例如s#/usr#/opt#g,避免转义
    sed 's#/usr/local#/opt/local#g' test.txt
  5. 引号:sed/awk 脚本用单引号,双引号会让 shell 提前解析变量,容易出现意外问题

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询