3.4 文本处理三剑客

3.4 Linux 文本处理三剑客: grep、sed、awk

一、grep 进阶

grep 用于按规则过滤文本内容,支持普通字符串、正则表达式以及扩展正则表达式。


1.1 扩展正则表达式(ERE)

使用:

1
grep -E "pattern" file

或:

1
egrep "pattern" file

常见元字符

元字符 含义 示例
+ 前一字符出现 1 次或多次 go+d
? 前一字符出现 0 次或 1 次 colou?r
` ` error|fatal
() 分组 (error|fatal):
{n,m} 重复 n 到 m 次 [0-9]{3,5}
\b 单词边界 \broot\b

示例

1
2
3
4
5
6
7
8
# 以 3 位数字开头的行
grep -E "^[0-9]{3}" /etc/passwd

# 多模式匹配
grep -E "error|fail|critical" log.txt

# 匹配空行或注释行
grep -E "^(#|$)" config.conf

1.2 常用选项

选项 说明
-i 忽略大小写
-v 反向匹配
-c 统计匹配数量
-n 显示行号
-l 只显示匹配文件名
-L 显示未匹配文件名
-r 递归搜索目录
-A n 显示匹配行后 n 行
-B n 显示匹配行前 n 行
-C n 显示匹配行前后各 n 行
--color=auto 高亮匹配内容

1.3 常见使用示例

匹配 IPv4 地址

1
grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" /var/log/messages

过滤 ssh 配置中的有效配置项

1
grep -E -v "^\s*(#|$)" /etc/ssh/sshd_config

二、sed 流编辑器

sed 适合进行非交互式文本编辑,包括:

  • 替换
  • 删除
  • 插入
  • 批量修改

基本语法:

1
sed [选项] '命令' 文件

2.1 文本替换

替换每行第一个匹配项

1
sed 's/old/new/' file.txt

替换所有匹配项

1
sed 's/old/new/g' file.txt

替换每行第二个匹配项

1
sed 's/old/new/2' file.txt

忽略大小写替换

1
sed 's/old/new/gI' file.txt

指定行范围替换

1
sed '3,5s/old/new/g' file.txt

仅匹配特定行后替换

1
sed '/pattern/s/old/new/g' file.txt

2.2 删除行

删除指定行

1
sed '3d' file.txt

删除多行

1
sed '3,5d' file.txt

删除匹配内容的行

1
sed '/pattern/d' file.txt

删除空行

1
sed '/^$/d' file.txt

2.3 打印控制

默认情况下,sed 会输出所有内容。

使用 -n 可关闭默认输出。

打印指定行

1
sed -n '3p' file.txt

打印匹配内容

1
sed -n '/error/p' file.txt

打印指定范围

1
sed -n '3,6p' file.txt

2.4 插入、追加、替换

插入新行

1
sed '3i\new line' file.txt

在指定行后追加

1
sed '3a\new line' file.txt

替换整行内容

1
sed '3c\replacement' file.txt

2.5 就地修改文件

直接修改文件

1
sed -i 's/old/new/g' file.txt

修改前自动备份

1
sed -i.bak 's/old/new/g' file.txt

生成:

1
file.txt.bak

2.6 常用处理技巧

去除行首空白

1
sed 's/^[[:space:]]*//' file.txt

每行末尾添加分号

1
sed 's/$/;/' file.txt

提取 IP 地址

1
ifconfig | sed -n '/inet /s/.*inet \([0-9.]*\).*/\1/p'

三、awk 基础

awk 适用于:

  • 按列处理文本
  • 数据统计
  • 格式化输出
  • 生成报表

基本语法:

1
awk 'pattern { action }' file

3.1 awk 工作机制

awk 默认按空白字符切分字段。

常用变量

变量 含义
$1 第一列
$2 第二列
$0 整行
NF 当前行字段数
NR 当前行号
FS 字段分隔符

3.2 基础列处理

输出第一列

1
awk '{print $1}' /etc/passwd

输出多个字段

1
awk '{print $1, $3}' file.txt

拼接文本输出

1
awk '{print "Name:", $1, "UID:", $3}' /etc/passwd

指定字段分隔符

1
awk -F: '{print $1, $3}' /etc/passwd

3.3 条件过滤

匹配包含 root 的行

1
awk '/root/' /etc/passwd

第三列大于等于 1000

1
awk '$3 >= 1000' /etc/passwd

第一列等于 root

1
awk -F: '$1 == "root"' /etc/passwd

第七列以 bash 结尾

1
awk -F: '$7 ~ /bash$/' /etc/passwd

3.4 内置变量与计算

求和

1
awk '{sum+=$1} END {print sum}' numbers.txt

输出行号

1
awk '{print NR, $0}' file.txt

字段数大于 3 的行

1
awk 'NF > 3' file.txt

3.5 格式化输出

1
awk '{printf "%-10s %5d\n", $1, $3}' file.txt

说明:

  • %-10s:左对齐字符串,宽度 10
  • %5d:右对齐整数,宽度 5

3.6 常见统计示例

统计系统中各类 shell 数量

1
awk -F: '{print $7}' /etc/passwd | sort | uniq -c

查找磁盘使用率超过 80% 的分区

1
df -h | awk 'NR>1 && $5+0 > 80 {print $1, $5}'

统计访问日志 IP 次数

1
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10

四、grep、sed、awk 组合使用

Linux 文本处理通常通过管道组合三者完成复杂操作。


4.1 提取普通用户信息

输出用户名与家目录:

1
awk -F: '$3>=1000 {print $1, $6}' /etc/passwd

4.2 批量修改 SSH 端口

1
sed -i.bak 's/^#*Port 22/Port 2222/' /etc/ssh/sshd_config

4.3 统计日志错误类型

1
grep ERROR app.log | awk -F: '{print $2}' | sort | uniq -c

4.4 提取所有 IPv4 地址

1
ifconfig | grep -Eo 'inet (addr:)?([0-9]+\.){3}[0-9]+' | grep -Eo '([0-9]+\.){3}[0-9]+'

五、总结

工具 核心作用
grep 文本过滤与匹配
sed 文本流编辑
awk 按列处理与统计

三者常通过管道组合:

1
grep → sed → awk

适用于:

  • 日志分析
  • 配置文件处理
  • 批量文本修改
  • 数据统计
  • 自动化运维脚本

3.4 文本处理三剑客
https://blog.sh462li.top/2026/05/28/3.4 文本处理三剑客/
作者
SHAO
发布于
2026年5月28日
许可协议