3.4 Linux 文本处理三剑客: grep、sed、awk
一、grep 进阶
grep 用于按规则过滤文本内容,支持普通字符串、正则表达式以及扩展正则表达式。
1.1 扩展正则表达式(ERE)
使用:
或:
常见元字符
| 元字符 |
含义 |
示例 |
|
+ |
前一字符出现 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
| 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 适合进行非交互式文本编辑,包括:
基本语法:
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 '/pattern/d' file.txt
|
删除空行
2.3 打印控制
默认情况下,sed 会输出所有内容。
使用 -n 可关闭默认输出。
打印指定行
打印匹配内容
1
| sed -n '/error/p' 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
|
生成:
2.6 常用处理技巧
去除行首空白
1
| sed 's/^[[:space:]]*//' 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 的行
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 |
按列处理与统计 |
三者常通过管道组合:
适用于:
- 日志分析
- 配置文件处理
- 批量文本修改
- 数据统计
- 自动化运维脚本