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

2 阅读3分钟

一、三者核心区别

工具定位主要用途处理单位
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.txt

awk 脚本结构

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.txt

3. 用 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.csv

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

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

六、选型建议

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

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

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