三剑客是 Linux/Unix 环境下处理文本的三大神器,擅长对日志、配置、数据文件进行快速过滤、编辑、格式化。
核心理念:grep 负责找,sed 负责改,awk 负责算(并格式化)。
一、grep —— 文本搜索利器
1. 基本作用
在文件或输入流中,按照正则表达式或固定字符串匹配行,并输出匹配的行。[正则表达式后面单独写一篇]
2. 语法结构
grep [选项] '模式' 文件1 文件2...
命令 | grep [选项] '模式'
3. 常用选项
| 选项 | 作用 |
|---|---|
-i |
忽略大小写 |
-v |
反向匹配(打印不匹配的行) |
-n |
显示匹配行在文件中的行号 |
-c |
仅统计匹配的行数 |
-l |
只输出包含匹配内容的文件名 |
-L |
只输出不包含匹配内容的文件名 |
-r / -R |
递归搜索目录下的所有文件 |
-w |
匹配整个单词(边界为字母/数字/下划线) |
-x |
匹配整行(行内容完全等于模式) |
-A n |
打印匹配行及其后 n 行 |
-B n |
打印匹配行及其前 n 行 |
-C n |
打印匹配行及其前后各 n 行 |
-E |
使用扩展正则表达式(等价于 egrep) |
-P |
使用 Perl 兼容正则(PCRE,需支持) |
--color=auto |
高亮匹配部分(很多发行版默认别名已带) |
4.示例
# 查找文件中包含 error(不区分大小写)的行,并显示行号
grep -in error app.log
# 统计不包含 success 的行数
grep -cv success app.log
# 递归搜索 /etc 下所有包含 "Host" 的.conf 文件,只显示文件名
grep -rl 'Host' /etc --include='*.conf'
# 匹配以数字结尾的行
grep '[0-9]$' data.txt
# 打印匹配行及后3行(常用于查看日志上下文)
grep -A 3 "panic" kernel.log
# 匹配整词 "to"(避免匹配 into/today)
grep -w 'to' article.txt
# 使用扩展正则:匹配 email 地址(用到正则表达式)
grep -E '\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b' contacts.txt
二.sed —— 流编辑器
1. 基本作用
非交互式文本编辑,对输入流逐行读取,执行编辑命令(删除、替换、插入、追加等),常用于批量替换、删除特定行。
2.语法结构
sed [选项] '脚本' 文件
命令 | sed [选项] '脚本'
3. 常用选项
| 选项 | 作用 |
|---|---|
-n |
静默模式(只打印用 p 显式要求的内容) |
-e |
多点编辑(执行多个脚本) |
-f |
从脚本文件中读取 sed 命令 |
-i |
直接修改原文件(危险,建议先不加 -i 测试) |
-i.bak |
修改前先备份为 .bak |
-r / -E |
使用扩展正则表达式 |
4.常用命令(脚本内部)
| 命令 | 含义 |
|---|---|
s/旧/新/ |
替换。默认只替换每行第一个匹配 |
s/旧/新/g |
替换所有匹配(g = global) |
s/旧/新/2 |
替换每行第2个匹配 |
d |
删除整行 |
p |
打印整行(常与 -n 配合) |
a\文本 |
在当前行后追加文本 |
i\文本 |
在当前行前插入文本 |
c\文本 |
用新文本替换当前行 |
y/源/目标/ |
字符转换(类似 tr) |
= |
打印当前行号 |
q |
退出 sed |
5. 地址范围(限定命令作用行)
| 写法 | 含义 |
|---|---|
| 无地址 | 作用于所有行 |
3 |
只作用于第3行 |
3,5 |
第3到第5行 |
3,+4 |
第3行及后面4行(共5行) |
3~2 |
从第3行开始,每隔2行(即3,5,7…) |
/正则/ |
匹配正则的行 |
3,/end/ |
从第3行到首次匹配 end 的行 |
6. 示例
# 将文件中的 foo 全部替换为 bar(全局)
sed 's/foo/bar/g' file.txt
# 只替换第2行的第一个 foo
sed '2s/foo/bar/' file.txt
# 删除空行
sed '/^$/d' file.txt
# 删除以 # 开头的注释行(慎用,可能删除有效注释)
sed '/^#/d' config.ini
# 打印第10到第20行(等价于 head -20 | tail -11)
sed -n '10,20p' large.log
# 将每行开头的空格替换为制表符(四个空格 → \t)
sed 's/^ /\t/' doc.txt
# 在匹配到 ERROR 的行后面插入一行 "--- Attention ---"
sed '/ERROR/a\--- Attention ---' log.txt
# 直接修改文件并备份
sed -i.bak 's/127.0.0.1/0.0.0.0/g' /etc/hosts
# 多点编辑:先删除空行,再将剩余行中的多个连续空格合并为一个空格
sed -e '/^$/d' -e 's/ */ /g' messy.txt
# 打印奇数行(GNU sed)
sed -n '1~2p' file.txt
# 使用扩展正则:替换 IP 地址为 REDACTED
sed -E 's/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/REDACTED/g' access.log
三、awk —— 数据处理与报告生成器
1. 基本作用
模式扫描与处理语言,擅长对列进行操作,内置变量、算术运算、条件判断、循环、数组,可以看作简化的脚本语言。
awk处理文本是一行一行地读,然后把每一行按照分隔符(默认是空白字符)切成不同的“字段”(Field)
2. 语法结构
awk [选项] '条件1 {动作1} 条件2 {动作2} ...' 文件
命令 | awk [选项] '...'
3. 常用选项
| 选项 | 作用 |
|---|---|
-F |
指定输入字段分隔符(默认空白) |
-v var=value |
定义 awk 变量 |
-f |
从脚本文件读取 awk 程序 |
4. 内置变量
| 变量 | 含义 |
|---|---|
$0 |
当前整行 |
$1, $2, ... |
当前行第1、2…个字段 |
NF |
当前行字段个数 |
NR |
已经读过的总行数(从1开始) |
FNR |
当前文件的记录数(多文件时每个文件独立计数) |
FS |
输入字段分隔符(可用 -F 设置) |
OFS |
输出字段分隔符(默认空格) |
RS |
输入记录分隔符(默认换行) |
ORS |
输出记录分隔符(默认换行) |
5. 基本结构
-
条件:可以是正则
/模式/、关系表达式(NR==2、$3>100)、BEGIN(处理前执行)、END(处理后执行) -
动作:放在
{}内,支持print、printf、赋值、if、for、while 等
# 打印第二列
awk '{print $2}' data.txt
# 指定分隔符为逗号,打印第一列和第三列
awk -F ',' '{print $1, $3}' csvfile.csv
# 使用条件:只处理第2行到第4行,打印整行
awk 'NR>=2 && NR<=4 {print}' file.txt
# BEGIN 先设置 FS,END 最后执行
awk 'BEGIN{FS=":"} {print $1} END{print "Done"}' /etc/passwd
6. 示例
基础过滤与计算
# 打印 uid 大于 1000 的用户名(/etc/passwd 第3列 uid)
awk -F: '$3 > 1000 {print $1}' /etc/passwd
# 统计文件行数
awk 'END{print NR}' file.txt
# 打印每行的最后一个字段
awk '{print $NF}' file.txt
# 打印字段数大于3的行
awk 'NF>3' file.txt
# 打印第5列匹配 "404" 的行
awk '$5 == "404" {print $0}' access.log
格式化输出
# 以表格形式输出磁盘信息(df -h 的 第1,4 列,带列名)
df -h | awk '{printf "%-20s %10s\n", $1, $4}'
# 打印带有行号的两列
awk '{print NR ": " $1 "\t" $2}' data.txt
数值汇总
# 求第二列的和
awk '{sum += $2} END{print "总和:", sum}'
# 求平均值(行数未知)
awk '{sum+=$3; count++} END{print "均值:", sum/count}' score.txt
# 分组统计(按第一列分组,累加第二列)
awk '{group[$1] += $2} END{for(g in group) print g, group[g]}' sales.txt
四、三剑客联用示例
# 1. 找出所有包含 IP 的行,提取 IP 并去重排序
grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' access.log | sort -u
# 2. 删除文件中的注释行和空行(sed),然后统计剩下的行数(wc)
sed -e '/^#/d' -e '/^$/d' config.ini | wc -l
# 3. 用 grep 筛选错误日志,awk 提取时间和错误码,再排序
grep "ERROR" app.log | awk '{print $1, $2, $9}' | sort | uniq -c
# 4. 使用 ps 和 awk 找出占用内存最大的前5个进程
ps aux | awk '{print $2, $4, $11}' | sort -k2 -nr | head -5
# 5. 统计每种 HTTP 状态码的个数(日志常见)
awk '{print $9}' access.log | grep -E '^[0-9]{3}$' | sort | uniq -c | sort -nr
五、速查对比表
| 工具 | 核心能力 | 默认处理单位 | 主要应用场景 |
|---|---|---|---|
| grep | 过滤、查找行 | 行 | 快速定位匹配内容 |
| sed | 替换、删除、插入 | 行 | 批量编辑文本,非交互式替换 |
| awk | 格式化、计算、报表 | 字段(列) | 复杂文本解析,数据汇总,结构转换 |
- THE END -
最后修改:2026年5月19日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://7d.delu7.cn/92/.html
共有 0 条评论