命令awk / tr / sed 的作用和用法 - AI生成

你想了解 Linux/Unix 中高频文本处理命令 awktrsed 的核心作用和基础用法,这三个命令是文本处理的「三剑客」,分工各有侧重:tr简单字符替换/转换工具(仅单字符级),sed流编辑器(侧重行级的查找、替换、增删),awk模式扫描与处理语言(侧重字段/列级的数据分析、格式化输出,功能最强大)。

下面按「作用定位 + 核心用法 + 经典示例」的结构讲解,示例基于 Linux 环境(CentOS/Ubuntu 通用),所有示例均可直接在终端执行。

一、tr 命令:字符级的替换/删除/压缩(最简单,仅处理单个字符)

核心作用

专门处理单个字符的转换、替换、删除、去重,仅能按字符匹配(不支持正则、不支持多字符/字符串替换),适合简单的字符级操作(如大小写转换、删特殊符号、替换分隔符)。

核心语法

1
2
tr [选项] 字符集1 字符集2  # 字符集1→字符集2 替换
tr [选项] 字符集 # 删除/压缩字符集内的字符

关键选项

  • -d:删除字符集内的所有字符(最常用);
  • -s:压缩连续重复的字符为单个(去重);
  • -t:截断字符集2,使其长度与字符集1一致(避免字符集2过长导致的匹配异常,部分系统默认开启)。

经典示例

  1. 大小写转换(字符集 a-z 对应 A-Z
1
2
echo "hello world" | tr a-z A-Z  # 输出:HELLO WORLD
echo "HELLO" | tr A-Z a-z # 输出:hello
  1. 删除指定字符(如删数字、标点)
1
2
echo "abc123def!@#" | tr -d 0-9  # 删数字,输出:abcdef!@#
echo "test,123;ok" | tr -d ',;' # 删标点,输出:test123ok
  1. 压缩连续重复字符(如去多余空格、换行)
1
2
echo "hello   world  !!  " | tr -s ' !'  # 压缩空格和!,输出:hello world !
cat file.txt | tr -s '\n' # 压缩文件中的连续空行为单个空行
  1. 替换单个分隔符(如把逗号换为空格)
1
echo "1,2,3,4" | tr ',' ' '  # 输出:1 2 3 4

二、sed 命令:流编辑器(行级文本处理,支持正则)

核心作用

行为单位处理文本,支持查找、替换、插入、删除、行编辑,可结合正则表达式,适合批量修改文本、过滤行内容(不修改原文件,仅输出处理结果,除非加写入选项)。

核心语法

1
2
sed [选项] '编辑指令' 文件名  # 处理文件
echo "文本" | sed [选项] '编辑指令' # 处理管道输入

关键选项

  • -n静默模式,仅输出被编辑指令匹配的行(默认输出所有行,包括未处理的);
  • -i原地修改原文件(最常用,Linux 下直接用 -i,Mac 下需用 -i '');
  • -e:执行多个编辑指令(多条件处理);
  • -r/-E:支持扩展正则表达式(默认是基础正则,需转义 +|() 等,加 -E 可省略转义)。

核心编辑指令(行级操作,格式:地址范围 操作

地址范围可省略(匹配所有行),常用:n(第n行)、n,m(n到m行)、/正则/(匹配正则的行);
常用操作:

  • s/原字符串/新字符串/标记替换(最核心,s=substitute);
  • d:删除匹配行;
  • a 文本:在匹配行下方插入文本;
  • i 文本:在匹配行上方插入文本;
  • p:打印匹配行(常与 -n 配合)。

替换指令的关键标记

  • g全局替换(一行内匹配到的所有结果都替换,默认仅替换第一个);
  • 数字:替换一行内第n个匹配结果;
  • p:打印替换后的行(常与 -n 配合)。

经典示例

准备测试文本:新建 test.txt,内容如下

1
2
3
4
hello world
test 123 test 456
linux is good
hello linux
  1. 基础替换(仅替换每行第一个匹配项)
1
sed 's/test/TEST/' test.txt  # 每行第一个test→TEST,输出处理结果(原文件不变)

输出:

1
2
3
4
hello world
TEST 123 test 456
linux is good
hello linux
  1. 全局替换(一行内所有匹配项)+ 原地修改原文件
1
sed -i 's/test/TEST/g' test.txt  # 所有test→TEST,直接修改原文件
  1. 按正则匹配行,再替换(如匹配含hello的行,替换world为Linux)
1
2
sed 's/hello world/hello Linux/' test.txt  # 精准匹配
sed '/hello/ s/world/Linux/g' test.txt # 先匹配含hello的行,再替换行内的world
  1. 删除行(如删空行、删指定行、删匹配正则的行)
1
2
3
4
sed '/^$/d' test.txt  # 删除空行(^$ 是正则,匹配空行)
sed '2d' test.txt # 删除第2行
sed '1,3d' test.txt # 删除1-3行
sed '/linux/d' test.txt # 删除含linux的行
  1. 静默模式+打印(仅输出匹配的行)
1
sed -n '/hello/p' test.txt  # 仅打印含hello的行,输出:hello world / hello linux
  1. 多指令处理(加 -e,如删空行+全局替换)
1
sed -e '/^$/d' -e 's/linux/LINUX/g' test.txt
  1. 插入文本(a=下插,i=上插)
1
2
sed '3a ====分隔符====' test.txt  # 在第3行下方插入分隔符
sed '/linux/i hello awk' test.txt # 在含linux的行上方插入hello awk

三、awk 命令:模式扫描与处理语言(字段级,全能文本分析)

核心作用

awk 不是简单命令,而是轻量级编程语言,核心以字段(列) 为单位处理文本,支持字段分割、条件判断、循环、数学运算、格式化输出,适合:

  • 表格/结构化文本的列提取、列计算(如日志、CSV、ps/df命令的输出);
  • 按条件过滤行+列的组合处理;
  • 统计分析(如求和、求平均值、去重计数)。

核心原理

awk逐行读取文本,默认以空格/制表符为分隔符,将每行分割为多个字段,用 $n 表示第n个字段($1=第一列,$2=第二列,…),$0 表示整行内容
内置变量会自动赋值(无需定义),是awk的核心。

核心语法

1
2
awk [选项] '条件{处理动作}' 文件名  # 处理文件
命令 | awk [选项] '条件{处理动作}' # 处理管道输出(最常用,如分析ps/df的输出)

关键选项

  • -F 分隔符:指定字段分隔符(默认空格/制表符,可指定为逗号、冒号等,如 -F ','-F ':');
  • -v 变量=值:定义自定义变量(传递外部值到awk内部)。

核心内置变量(必记)

变量 作用
$0 整行内容
$1~$n 第1~n个字段(列)
NF 每行的字段总数(列数,如NF=3表示每行3列)
NR 已读取的行号(全局行号,多文件时连续计数)
FNR 当前文件的行号(多文件时,每个文件重新计数)
FS 输入字段分隔符(等价于 -F 选项)
OFS 输出字段分隔符(默认空格,可自定义)

核心语法规则

  1. 条件可省略:表示匹配所有行,执行处理动作;
  2. 处理动作必须用 {} 包裹,多个动作用分号; 分隔;
  3. 支持条件判断==/!=(等于/不等于)、>/<(大于/小于)、~/!~(匹配/不匹配正则);
  4. 支持格式化输出print(简单输出)、printf(精准格式化,如指定列宽、小数位数,与C语言printf一致);
  5. 支持BEGIN/END块BEGIN{} 处理文本执行(仅1次,如初始化变量、打印表头);END{} 处理文本执行(仅1次,如统计结果输出)。

经典示例

示例1:基础列提取(处理系统命令输出,最常用)

1
2
df -h | awk '{print $1,$5,$6}'  # 提取df -h的第1、5、6列(磁盘名、使用率、挂载点)
ps -ef | awk '/java/ {print $2,$8}' # 过滤含java的行,提取进程号($2)和进程名($8)

示例2:指定分隔符(处理CSV/冒号分隔的文本)

  • 处理 /etc/passwd(冒号:分隔,提取用户名$1和登录shell$7):
1
awk -F ':' '{print $1,"→",$7}' /etc/passwd  # 输出:root → /bin/bash  等
  • 处理逗号分隔的文本:
1
echo "1,zhangsan,20;2,lisi,25" | tr ';' '\n' | awk -F ',' '{print $2,$3}'

示例3:条件过滤(按行/列条件筛选)

1
2
3
4
# 提取df -h中使用率>80%的磁盘($5是使用率,需去掉%,用gsub删字符)
df -h | awk 'gsub(/%/,"",$5) && $5>80 {print $1,$5"%"}'
# 过滤test.txt中第2列是数字的行
awk '$2 ~ /^[0-9]+$/ {print $0}' test.txt

示例4:统计分析(求和、计数,结合BEGIN/END)

1
2
3
4
# 生成测试数据:3行,第2列是数字
echo -e "a 10\nb 20\nc 30" > num.txt
# 求和第2列,计数行数,求平均值
awk 'BEGIN{sum=0;count=0} {sum+=$2;count++} END{print "总行数:"count,"总和:"sum,"平均值:"sum/count}' num.txt

输出:总行数:3 总和:60 平均值:20
示例5:格式化输出(printf,指定列宽、对齐)

1
awk -F ':' '{printf "%-10s %-20s\n", $1, $7}' /etc/passwd
  • %-10s:左对齐,占10个字符宽度;%s 表示字符串,%d 表示数字,%f 表示浮点数。
    示例6:修改输出分隔符(OFS)
1
2
# 提取/etc/passwd的$1和$7,用【|】分隔输出
awk -F ':' 'OFS="|") {print $1,$7}' /etc/passwd

四、三个命令的核心区别(快速选型)

命令 处理粒度 核心优势 适用场景 正则支持
tr 单个字符 简单高效,轻量 大小写转换、删/压缩字符、单字符替换 不支持
sed 整行 行级增删改查,批量编辑 文本替换、删空行、行插入、批量修改文件 支持(基础/扩展)
awk 字段/列 列提取、条件统计、数学运算 结构化文本分析、列过滤、求和计数、命令输出分析 支持(基础/扩展)

总结

  1. 简单字符操作(换大小写、删符号、单字符替换)→ 用 tr,最快最轻便;
  2. 行级的查找替换、增删行、批量修改文件 → 用 sed,结合正则做行编辑;
  3. 列级的提取、过滤、统计、计算,或处理结构化文本/命令输出 → 用 awk,功能最全面(堪称轻量文本分析语言);
  4. 实际使用中常组合搭配(如 tr 先做字符转换,再用 sed 行处理,最后用 awk 列统计),比如 cat file | tr -d ' ' | sed '/^$/d' | awk -F ',' '{print $1}'

这三个命令的核心是文本处理的粒度差异,记住「字符→tr,行→sed,列→awk」,就能快速选对工具,后续结合正则和管道,能处理Linux下90%以上的文本场景。


命令awk / tr / sed 的作用和用法 - AI生成
https://blog.carlvictor.cn/posts/eee88be2.html
作者
Carl Victor
发布于
2026年8月27日
许可协议