一、三者核心区别 工具 定位 主要用途 处理单位 grep 过滤/搜索 快速匹配文本模式 行 sed 流编辑器 替换、删除、插入、修改 行(可逐行编辑) awk 报告生成器 复杂的格式化、统计、计算 字段(列)
简单记忆:
grep = 找东西sed = 改东西(非交互式)awk = 算东西(列操作、统计)二、grep – 强大的文本搜索 基本语法 grep [ 选项] '模式' 文件名常用选项 选项 说明 -i忽略大小写 -v反向匹配(不包含模式的行) -n显示行号 -r/-R递归搜索目录 -E使用扩展正则(egrep) -l只显示匹配的文件名 -c只统计匹配的行数
示例 # 基本搜索 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 – 流编辑器(非交互式) 基本语法 sed [ 选项] '命令' 文件名常用命令 命令 说明 s/old/new/替换(默认只替换每行第一个) s/old/new/g全局替换 d删除行 p打印行(常与 -n 配合) a追加文本 i插入文本 c替换整行
示例 # 替换(默认只改第一个匹配) 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 替换分隔符 可以用|、#等避免转义路径:
sed 's#/旧路径#/新路径#g' file.txt四、awk – 文本处理语言 基本语法 awk '条件 {动作}' 文件名内置变量 变量 含义 $0整行内容 $1, $2...第1列、第2列… NF当前行的字段数 NR当前行号 FS输入字段分隔符(默认空格/tab) OFS输出字段分隔符 RS输入行分隔符(默认换行)
示例 # 打印第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.txtawk 脚本结构 awk 'BEGIN {初始化} 主体处理 {动作} END {收尾}' file 五、实际组合使用案例 1. 从日志中提取特定时间段的错误IP grep '2025-05-20' app.log| grep 'ERROR' | awk '{print $1}' | sort | uniq -c 2. 替换文本中的多个模式 sed -e 's/foo/bar/g' -e 's/hello/hi/g' file.txt3. 用 awk 代替 grep + cut # 传统方式 ps aux| grep nginx| awk '{print $2}' # 只用 awk ps aux| awk '/nginx/ {print $2}' 4. 修改 CSV 文件并重新格式化 awk -F',' 'BEGIN{OFS="|"} {print $1, $3, $5}' data.csv5. 查找某目录下包含特定模式的文件名 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 默认扩展正则