Linux系统grep、sed 、awk介绍下,使用方法及区别?

一、三者核心区别

工具 定位 主要用途 处理单位
grep 过滤/搜索 快速匹配文本模式 行
sed 流编辑器 替换、删除、插入、修改 行(可逐行编辑)
awk 报告生成器 复杂的格式化、统计、计算 字段(列)

简单记忆:

  • grep = 找东西
  • sed = 改东西(非交互式)
  • awk = 算东西(列操作、统计)

二、grep -- 强大的文本搜索

基本语法

bash 复制代码
grep [选项] '模式' 文件名

常用选项

选项 说明
-i 忽略大小写
-v 反向匹配(不包含模式的行)
-n 显示行号
-r / -R 递归搜索目录
-E 使用扩展正则(egrep)
-l 只显示匹配的文件名
-c 只统计匹配的行数

示例

bash 复制代码
# 基本搜索
grep 'error' /var/log/syslog

# 递归搜索当前目录下的所有 .conf 文件
grep -r 'Listen' /etc/ --include='*.conf'

# 输出不包含 # 注释的行
grep -v '^#' /etc/nginx/nginx.conf

# 匹配单词边界(避免匹配到 contains 中的 in)
grep '\bin\b' file.txt

# 扩展正则:匹配 error 或 warning
grep -E 'error|warning' log.txt

三、sed -- 流编辑器(非交互式)

基本语法

bash 复制代码
sed [选项] '命令' 文件名

常用命令

命令 说明
s/old/new/ 替换(默认只替换每行第一个)
s/old/new/g 全局替换
d 删除行
p 打印行(常与 -n 配合)
a 追加文本
i 插入文本
c 替换整行

示例

bash 复制代码
# 替换(默认只改第一个匹配)
sed 's/old/new/' file.txt

# 全局替换并保存到原文件(-i 直接修改)
sed -i 's/old/new/g' file.txt

# 删除空行
sed '/^$/d' file.txt

# 删除第2到第5行
sed '2,5d' file.txt

# 打印第10行(-n 禁止自动打印)
sed -n '10p' file.txt

# 在匹配行后追加一行
sed '/pattern/a\新增内容' file.txt

# 用 & 引用匹配到的内容(给数字加括号)
echo "hello 123 world" | sed 's/[0-9]\+/(&)/'
# 输出: hello (123) world

替换分隔符

可以用 |、# 等避免转义路径:

bash 复制代码
sed 's#/旧路径#/新路径#g' file.txt

四、awk -- 文本处理语言

基本语法

bash 复制代码
awk '条件 {动作}' 文件名

内置变量

变量 含义
$0 整行内容
$1, $2... 第1列、第2列...
NF 当前行的字段数
NR 当前行号
FS 输入字段分隔符(默认空格/tab)
OFS 输出字段分隔符
RS 输入行分隔符(默认换行)

示例

bash 复制代码
# 打印第1列和第3列
awk '{print $1, $3}' file.txt

# 指定冒号分隔符(处理 /etc/passwd)
awk -F':' '{print $1, $6}' /etc/passwd

# 打印行号及整行
awk '{print NR, $0}' file.txt

# 统计第三列的总和
awk '{sum += $3} END {print "总和:", sum}' data.txt

# 条件过滤:第2列大于100的行
awk '$2 > 100' file.txt

# 格式化输出
awk '{printf "%-10s %5d\n", $1, $2}' file.txt

# 匹配正则的行
awk '/error/ {print NR, $0}' log.txt

# 内置函数:取整、长度
awk '{print int($1), length($2)}' file.txt

awk 脚本结构

bash 复制代码
awk 'BEGIN {初始化} 主体处理 {动作} END {收尾}' file

五、实际组合使用案例

1. 从日志中提取特定时间段的错误IP

bash 复制代码
grep '2025-05-20' app.log | grep 'ERROR' | awk '{print $1}' | sort | uniq -c

2. 替换文本中的多个模式

bash 复制代码
sed -e 's/foo/bar/g' -e 's/hello/hi/g' file.txt

3. 用 awk 代替 grep + cut

bash 复制代码
# 传统方式
ps aux | grep nginx | awk '{print $2}'

# 只用 awk
ps aux | awk '/nginx/ {print $2}'

4. 修改 CSV 文件并重新格式化

bash 复制代码
awk -F',' 'BEGIN{OFS="|"} {print $1, $3, $5}' data.csv

5. 查找某目录下包含特定模式的文件名

bash 复制代码
ls -l | awk '$9 ~ /\.log$/ {print $9}'   # 列出 .log 文件
ls -l | sed -n '/\.log$/p'               # 同样功能

六、选型建议

场景 推荐工具
只想快速看日志里有没有 "error" grep
需要批量替换文件中的某个词 sed -i
按列统计、计算、格式化输出 awk
多行匹配或上下文(前后几行) grep -A 3 -B 2 或 awk
跨文件批量修改 sed + find
处理 JSON / XML / 复杂结构 建议用 jq 或 Python

三者的正则语法略有差异:

  • grep 默认基础正则,-E 启用扩展
  • sed 默认基础正则,-r 或 -E 启用扩展
  • awk 默认扩展正则

相关推荐
刘马想放假10 分钟前
CANviz 使用指南|Linux 安装、DBC 解码、实时曲线与 J1939 实战
linux·python·websocket
kloc1 小时前
聊天室项目入口网关子服务的实现
linux·c++
GeW1 小时前
深圳APEC峰会倒计时:数据库与Linux运维的"隐形考场"
linux
梦到啥说啥3 小时前
Linux网络编程:UDP网络协议
linux·网络协议·udp
无足鸟ICT4 小时前
【RHCA+】ipcrm命令(删除IPC资源)
linux
星恒随风5 小时前
MySQL 从零入门(四):表的增删改查与基础查询详解
linux·服务器·数据库·笔记·mysql
Z21-X6 小时前
云原生运维学习笔记:ECShop全链路容器化部署与Docker底层资源隔离深度剖析
运维·笔记·学习·云原生
陈希1238 小时前
Linux 网络诊断工具实战:ping、curl、tcpdump、mtr、dig 用法详解
linux·网络·tcpdump
进击的荆棘8 小时前
Linux系统——线程同步与互斥之线程池和安全
linux·运维·服务器·安全·单例模式·线程
刘大望8 小时前
不用买开发板:用 QEMU 走通嵌入式 Linux 全流程(三)存储与网络实地验证
linux·qemu·嵌入式linux·alpine