Linux 三剑客详解(grep、sed、awk)

2026-5-8 10 5/8

三剑客是 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(处理后执行)

  • 动作:放在 {} 内,支持 printprintf、赋值、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 -

delu

5月19日08:54

最后修改:2026年5月19日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论