你想了解 Linux/Unix 中高频文本处理命令 awk、tr、sed 的核心作用和基础用法,这三个命令是文本处理的「三剑客」,分工各有侧重:tr 是简单字符替换/转换工具(仅单字符级),sed 是流编辑器(侧重行级的查找、替换、增删),awk 是模式扫描与处理语言(侧重字段/列级的数据分析、格式化输出,功能最强大)。
下面按「作用定位 + 核心用法 + 经典示例」的结构讲解,示例基于 Linux 环境(CentOS/Ubuntu 通用),所有示例均可直接在终端执行。
一、tr 命令:字符级的替换/删除/压缩(最简单,仅处理单个字符)
核心作用
专门处理单个字符的转换、替换、删除、去重,仅能按字符匹配(不支持正则、不支持多字符/字符串替换),适合简单的字符级操作(如大小写转换、删特殊符号、替换分隔符)。
核心语法
1 2
| tr [选项] 字符集1 字符集2 tr [选项] 字符集
|
关键选项
-d:删除字符集内的所有字符(最常用);
-s:压缩连续重复的字符为单个(去重);
-t:截断字符集2,使其长度与字符集1一致(避免字符集2过长导致的匹配异常,部分系统默认开启)。
经典示例
- 大小写转换(字符集
a-z 对应 A-Z)
1 2
| echo "hello world" | tr a-z A-Z echo "HELLO" | tr A-Z a-z
|
- 删除指定字符(如删数字、标点)
1 2
| echo "abc123def!@#" | tr -d 0-9 echo "test,123;ok" | tr -d ',;'
|
- 压缩连续重复字符(如去多余空格、换行)
1 2
| echo "hello world !! " | tr -s ' !' cat file.txt | tr -s '\n'
|
- 替换单个分隔符(如把逗号换为空格)
1
| echo "1,2,3,4" | tr ',' ' '
|
二、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
| sed 's/test/TEST/' test.txt
|
输出:
1 2 3 4
| hello world TEST 123 test 456 linux is good hello linux
|
- 全局替换(一行内所有匹配项)+ 原地修改原文件
1
| sed -i 's/test/TEST/g' test.txt
|
- 按正则匹配行,再替换(如匹配含hello的行,替换world为Linux)
1 2
| sed 's/hello world/hello Linux/' test.txt sed '/hello/ s/world/Linux/g' test.txt
|
- 删除行(如删空行、删指定行、删匹配正则的行)
1 2 3 4
| sed '/^$/d' test.txt sed '2d' test.txt sed '1,3d' test.txt sed '/linux/d' test.txt
|
- 静默模式+打印(仅输出匹配的行)
1
| sed -n '/hello/p' test.txt
|
- 多指令处理(加
-e,如删空行+全局替换)
1
| sed -e '/^$/d' -e 's/linux/LINUX/g' test.txt
|
- 插入文本(a=下插,i=上插)
1 2
| sed '3a ====分隔符====' test.txt sed '/linux/i hello awk' test.txt
|
三、awk 命令:模式扫描与处理语言(字段级,全能文本分析)
核心作用
awk 不是简单命令,而是轻量级编程语言,核心以字段(列) 为单位处理文本,支持字段分割、条件判断、循环、数学运算、格式化输出,适合:
- 表格/结构化文本的列提取、列计算(如日志、CSV、ps/df命令的输出);
- 按条件过滤行+列的组合处理;
- 统计分析(如求和、求平均值、去重计数)。
核心原理
awk 会逐行读取文本,默认以空格/制表符为分隔符,将每行分割为多个字段,用 $n 表示第n个字段($1=第一列,$2=第二列,…),$0 表示整行内容;
内置变量会自动赋值(无需定义),是awk的核心。
核心语法
1 2
| awk [选项] '条件{处理动作}' 文件名 命令 | awk [选项] '条件{处理动作}'
|
关键选项
-F 分隔符:指定字段分隔符(默认空格/制表符,可指定为逗号、冒号等,如 -F ','、-F ':');
-v 变量=值:定义自定义变量(传递外部值到awk内部)。
核心内置变量(必记)
| 变量 |
作用 |
$0 |
整行内容 |
$1~$n |
第1~n个字段(列) |
NF |
每行的字段总数(列数,如NF=3表示每行3列) |
NR |
已读取的行号(全局行号,多文件时连续计数) |
FNR |
当前文件的行号(多文件时,每个文件重新计数) |
FS |
输入字段分隔符(等价于 -F 选项) |
OFS |
输出字段分隔符(默认空格,可自定义) |
核心语法规则
- 条件可省略:表示匹配所有行,执行处理动作;
- 处理动作必须用
{} 包裹,多个动作用分号; 分隔;
- 支持条件判断:
==/!=(等于/不等于)、>/<(大于/小于)、~/!~(匹配/不匹配正则);
- 支持格式化输出:
print(简单输出)、printf(精准格式化,如指定列宽、小数位数,与C语言printf一致);
- 支持BEGIN/END块:
BEGIN{} 处理文本前执行(仅1次,如初始化变量、打印表头);END{} 处理文本后执行(仅1次,如统计结果输出)。
经典示例
示例1:基础列提取(处理系统命令输出,最常用)
1 2
| df -h | awk '{print $1,$5,$6}' ps -ef | awk '/java/ {print $2,$8}'
|
示例2:指定分隔符(处理CSV/冒号分隔的文本)
- 处理
/etc/passwd(冒号:分隔,提取用户名$1和登录shell$7):
1
| awk -F ':' '{print $1,"→",$7}' /etc/passwd
|
1
| echo "1,zhangsan,20;2,lisi,25" | tr ';' '\n' | awk -F ',' '{print $2,$3}'
|
示例3:条件过滤(按行/列条件筛选)
1 2 3 4
| df -h | awk 'gsub(/%/,"",$5) && $5>80 {print $1,$5"%"}'
awk '$2 ~ /^[0-9]+$/ {print $0}' test.txt
|
示例4:统计分析(求和、计数,结合BEGIN/END)
1 2 3 4
| echo -e "a 10\nb 20\nc 30" > num.txt
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
| awk -F ':' 'OFS="|") {print $1,$7}' /etc/passwd
|
四、三个命令的核心区别(快速选型)
| 命令 |
处理粒度 |
核心优势 |
适用场景 |
正则支持 |
| tr |
单个字符 |
简单高效,轻量 |
大小写转换、删/压缩字符、单字符替换 |
不支持 |
| sed |
整行 |
行级增删改查,批量编辑 |
文本替换、删空行、行插入、批量修改文件 |
支持(基础/扩展) |
| awk |
字段/列 |
列提取、条件统计、数学运算 |
结构化文本分析、列过滤、求和计数、命令输出分析 |
支持(基础/扩展) |
总结
- 简单字符操作(换大小写、删符号、单字符替换)→ 用
tr,最快最轻便;
- 行级的查找替换、增删行、批量修改文件 → 用
sed,结合正则做行编辑;
- 列级的提取、过滤、统计、计算,或处理结构化文本/命令输出 → 用
awk,功能最全面(堪称轻量文本分析语言);
- 实际使用中常组合搭配(如
tr 先做字符转换,再用 sed 行处理,最后用 awk 列统计),比如 cat file | tr -d ' ' | sed '/^$/d' | awk -F ',' '{print $1}'。
这三个命令的核心是文本处理的粒度差异,记住「字符→tr,行→sed,列→awk」,就能快速选对工具,后续结合正则和管道,能处理Linux下90%以上的文本场景。