主题
文本处理三剑客:grep/awk/sed
课程介绍
grep、awk、sed是Linux系统中三个强大的文本处理工具,被称为"文本处理三剑客"。本课程将详细讲解这三个工具的使用方法,包括基本用法、高级用法、组合应用等内容,帮助你掌握文本处理的核心技巧。
1. grep命令
1.1 grep概述
grep是Linux系统中用于搜索文本的命令。
grep的特点:
| 特点 | 说明 |
|---|---|
| 搜索文本 | 搜索文件中的文本 |
| 正则表达式 | 支持正则表达式 |
| 递归搜索 | 支持递归搜索 |
| 颜色高亮 | 支持颜色高亮 |
1.2 grep基本用法
grep的基本用法。
命令:
bash
# 搜索文件中的文本
grep "ERROR" /var/log/syslog
# 搜索多个文件中的文本
grep "ERROR" /var/log/syslog /var/log/messages
# 递归搜索目录中的文本
grep -r "ERROR" /var/log/
# 搜索文件中的文本,并显示行号
grep -n "ERROR" /var/log/syslog
# 搜索文件中的文本,并显示文件名
grep -l "ERROR" /var/log/*.log
# 搜索文件中的文本,并显示匹配数量
grep -c "ERROR" /var/log/syslog1.3 grep高级用法
grep的高级用法。
命令:
bash
# 搜索包含ERROR或WARN的文本
grep -E "ERROR|WARN" /var/log/syslog
# 搜索不包含ERROR的文本
grep -v "ERROR" /var/log/syslog
# 搜索文件中的文本,并显示前后3行
grep -C 3 "ERROR" /var/log/syslog
# 搜索文件中的文本,并显示后3行
grep -A 3 "ERROR" /var/log/syslog
# 搜索文件中的文本,并显示前3行
grep -B 3 "ERROR" /var/log/syslog
# 搜索文件中的文本,并忽略大小写
grep -i "error" /var/log/syslog
# 搜索文件中的文本,并使用正则表达式
grep -E "^ERROR" /var/log/syslog1.4 grep常用选项
| 选项 | 说明 |
|---|---|
-i | 忽略大小写 |
-v | 反向匹配 |
-n | 显示行号 |
-c | 只显示匹配行数 |
-l | 只显示文件名 |
-r | 递归搜索 |
-E | 使用扩展正则表达式 |
-A n | 显示匹配行后n行 |
-B n | 显示匹配行前n行 |
-C n | 显示匹配行前后n行 |
2. awk命令
2.1 awk概述
awk是Linux系统中用于文本处理的命令。
awk的特点:
| 特点 | 说明 |
|---|---|
| 文本处理 | 强大的文本处理能力 |
| 模式匹配 | 支持模式匹配 |
| 字段处理 | 支持字段处理 |
| 脚本编程 | 支持脚本编程 |
2.2 awk基本用法
awk的基本用法。
命令:
bash
# 打印文件的第一列
awk '{print $1}' /etc/passwd
# 打印文件的第二列
awk '{print $2}' /etc/passwd
# 打印文件的第一列和第二列
awk '{print $1, $2}' /etc/passwd
# 打印文件的所有列
awk '{print $0}' /etc/passwd
# 打印文件的行号和内容
awk '{print NR, $0}' /etc/passwd
# 打印文件的列数
awk '{print NF}' /etc/passwd2.3 awk高级用法
awk的高级用法。
命令:
bash
# 打印包含ERROR的行
awk '/ERROR/ {print $0}' /var/log/syslog
# 打印第一列等于ERROR的行
awk '$1 == "ERROR" {print $0}' /var/log/syslog
# 打印第一列包含ERROR的行
awk '$1 ~ /ERROR/ {print $0}' /var/log/syslog
# 打印第一列不包含ERROR的行
awk '$1 !~ /ERROR/ {print $0}' /var/log/syslog
# 统计ERROR的数量
awk '/ERROR/ {count++} END {print count}' /var/log/syslog
# 计算第一列的平均值
awk '{sum+=$1} END {print sum/NR}' /var/log/syslog
# 按第一列分组统计
awk '{count[$1]++} END {for (key in count) print key, count[key]}' /var/log/syslog2.4 awk内置变量
| 变量 | 说明 |
|---|---|
$0 | 整行内容 |
$1-$n | 第1-n列 |
NF | 当前行字段数 |
NR | 当前行号 |
FS | 字段分隔符 |
OFS | 输出字段分隔符 |
RS | 行分隔符 |
ORS | 输出行分隔符 |
2.5 awk常用选项
| 选项 | 说明 |
|---|---|
-F | 指定字段分隔符 |
-v | 定义变量 |
-f | 指定脚本文件 |
示例:
bash
# 指定分隔符为冒号
awk -F: '{print $1}' /etc/passwd
# 定义变量
awk -v var="hello" '{print var, $0}' file.txt
# 使用脚本文件
awk -f script.awk file.txt3. sed命令
3.1 sed概述
sed是Linux系统中用于文本编辑的命令。
sed的特点:
| 特点 | 说明 |
|---|---|
| 文本编辑 | 强大的文本编辑能力 |
| 流编辑 | 流式编辑文本 |
| 正则表达式 | 支持正则表达式 |
| 批量处理 | 支持批量处理 |
3.2 sed基本用法
sed的基本用法。
命令:
bash
# 替换文件中的文本
sed 's/ERROR/WARN/' /var/log/syslog
# 替换文件中的所有文本
sed 's/ERROR/WARN/g' /var/log/syslog
# 删除文件中的空行
sed '/^$/d' /var/log/syslog
# 删除文件中的注释行
sed '/^#/d' /var/log/syslog
# 删除文件中的指定行
sed '5d' /var/log/syslog
# 打印文件的指定行
sed -n '5p' /var/log/syslog
# 打印文件的指定行范围
sed -n '5,10p' /var/log/syslog3.3 sed高级用法
sed的高级用法。
命令:
bash
# 替换文件中的文本,并备份原文件
sed -i.bak 's/ERROR/WARN/g' /var/log/syslog
# 替换文件中的文本,并只替换第5行
sed '5s/ERROR/WARN/' /var/log/syslog
# 替换文件中的文本,并只替换第5到10行
sed '5,10s/ERROR/WARN/' /var/log/syslog
# 替换文件中的文本,并使用正则表达式
sed 's/^ERROR/WARN/' /var/log/syslog
# 在文件中插入文本
sed '5i\INSERT TEXT' /var/log/syslog
# 在文件中追加文本
sed '5a\APPEND TEXT' /var/log/syslog
# 在文件中替换指定行
sed '5c\REPLACE TEXT' /var/log/syslog3.4 sed常用命令
| 命令 | 说明 |
|---|---|
s | 替换 |
d | 删除 |
p | 打印 |
i | 在行前插入 |
a | 在行后追加 |
c | 替换整行 |
g | 全局替换 |
3.5 sed常用选项
| 选项 | 说明 |
|---|---|
-n | 只输出匹配的行 |
-i | 直接修改文件 |
-e | 执行多个命令 |
-f | 指定脚本文件 |
示例:
bash
# 执行多个命令
sed -e 's/ERROR/WARN/g' -e 's/INFO/DEBUG/g' file.txt
# 使用脚本文件
sed -f script.sed file.txt4. 三剑客组合应用
4.1 grep + awk 组合
bash
# 搜索ERROR日志并提取特定字段
grep "ERROR" /var/log/syslog | awk '{print $1, $2, $3, $5}'
# 搜索特定IP的访问记录并统计
grep "192.168.1.100" /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -nr4.2 grep + sed 组合
bash
# 搜索并替换特定内容
grep -l "old_text" *.txt | xargs sed -i 's/old_text/new_text/g'
# 搜索并删除特定行
grep -n "DELETE_ME" file.txt | cut -d: -f1 | xargs -I {} sed -i '{}d' file.txt4.3 awk + sed 组合
bash
# 提取特定列并替换内容
awk '{print $1, $2}' file.txt | sed 's/old/new/g'
# 格式化输出并替换
awk '{printf "%-10s %s\n", $1, $2}' file.txt | sed 's/old/new/g'4.4 三剑客组合
bash
# 搜索、提取、替换
grep "ERROR" /var/log/syslog | awk '{print $1, $2, $3, $5}' | sed 's/ERROR/WARN/g'
# 复杂文本处理流程
cat file.txt | grep -v "^#" | awk -F: '{print $1}' | sed 's/^/USER: /' | sort | uniq5. 实用技巧
5.1 性能优化
bash
# 使用fgrep处理固定字符串(比grep快)
fgrep "fixed_string" file.txt
# 使用LC_ALL=C加速grep
LC_ALL=C grep "pattern" file.txt
# 限制搜索范围
grep "pattern" file.txt | head -1005.2 调试技巧
bash
# 显示awk执行的每一步
awk --dump-variables=vars.txt '{print $0}' file.txt
# 显示sed执行的命令
sed -n 's/pattern/replacement/gp' file.txt5.3 常见问题解决
bash
# 处理特殊字符
grep -F "special*chars" file.txt
# 处理多行匹配
awk '/start/,/end/' file.txt
# 处理大文件
sed -n '1,100p' large_file.txt课程总结
这节课我们学习了文本处理三剑客:grep、awk、sed。
核心内容:
- grep命令(基本用法、高级用法、常用选项)
- awk命令(基本用法、高级用法、内置变量、常用选项)
- sed命令(基本用法、高级用法、常用命令、常用选项)
- 三剑客组合应用
- 实用技巧
重要命令:
grep:搜索文本awk:文本处理sed:文本编辑sort:排序uniq:去重wc:统计
grep、awk、sed是Linux系统中三个强大的文本处理工具,掌握这些知识后,我们将在后续课程中学习Shell脚本实战等内容。
课后练习
练习1(基础)
使用grep命令搜索文件中的ERROR日志。
练习2(进阶)
使用awk命令统计文件中每行的字段数,并输出行号。
练习3(拓展)
使用sed命令替换文件中的所有ERROR为WARN,并备份原文件。
练习4(综合)
组合使用grep、awk、sed命令,实现以下功能:
- 搜索包含ERROR的行
- 提取第1、2、3列
- 将ERROR替换为WARN
- 输出结果