跳转到内容

文本处理三剑客: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/syslog

1.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/syslog

1.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/passwd

2.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/syslog

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

3. 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/syslog

3.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/syslog

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

4. 三剑客组合应用

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 -nr

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

4.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 | uniq

5. 实用技巧

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 -100

5.2 调试技巧

bash
# 显示awk执行的每一步
awk --dump-variables=vars.txt '{print $0}' file.txt

# 显示sed执行的命令
sed -n 's/pattern/replacement/gp' file.txt

5.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命令,实现以下功能:

  1. 搜索包含ERROR的行
  2. 提取第1、2、3列
  3. 将ERROR替换为WARN
  4. 输出结果

评论区

专业的Linux技术学习平台,从入门到精通的完整学习路径