前言:文本三剑客一般指grep sed awk三款文本处理命令,虽都是处理文本命令但侧重点各不相同

一、grep—查找文本行

grep “搜索内容” 文件名 #查找文件中包含“搜索内容”的所有行

grep -i "搜索内容" 文件名 #ignore 忽略大小写查找

grep -n "搜索内容" 文件名 #number 显示匹配行的行号

grep -r "搜索内容" 目录路径 #recursive 递归搜索目录及其子目录中的文件

grep -v "排除内容" 文件名 #invert 排除掉包含“排除内容”的行

grep也支持正则表达式搜索,因此可以复杂匹配:

grep "^开始" 文件名 # 匹配以“开始”开头的行

grep "结束$" 文件名 # 匹配以“结束”结尾的行

二、sed—编辑器

sed 's/旧文本/新文本' 文件名 #替换文件中第一次出现的“旧文本”为“新文本”。

sed 's/旧文本/新文本/g' 文件名 #替换所有出现的旧文本

sed '2d' 文件名 #删除文件中第二行

sed -i 's/旧文本/新文本/g' #直接在文件中修改但不输出

sed -n '/匹配内容/p' 文件名 #查找包含匹配内容的行,并且只输出这些匹配的行,其他不匹配的行不显示

这是一行文本。
我喜欢吃苹果。
这个文件用于演示 sed 命令。
苹果派很好吃。
学习 Linux 非常有趣。

sed -n '/苹果/p' file.txt
#输出结果为:
我喜欢吃苹果。
苹果派很好吃。

grep "苹果" file.txt
#输出结果为:
我喜欢吃苹果。
苹果派很好吃。

三、awk—处理格式化数据

awk '{prin $1,$2}' 文件名 #打印文件中第一列和第二列

awk '$2 > 50 {print $1, $2}' 文件名 #打印第二列值大于50的行

awk '{sum += $3} END {print sum}' 文件名 #计算文件第三列的总和

awk -F ',' '{print $1, $2}' 文件名 #?

awk 'NR >= 2 && NR <= 4 {print $0}' 文件名 #打印第二到四行

四、总结

工具 功能 常见场景 示例命令
grep 文本搜索工具 - 查找文件中包含特定内容的行 - 支持正则表达式进行模式匹配 - 快速查找日志文件中的关键字 grep "error" log.txt 查找 log.txt 文件中包含 error 的行。 grep -r "pattern" /var/log/ 递归查找 /var/log/ 目录下所有文件中包含 pattern 的行。
sed 流编辑器 - 快速替换文本内容 - 删除、插入或替换文件中的行 - 对文件内容进行简单编辑处理 sed 's/foo/bar/' file.txt 替换 file.txt 文件中第一次出现的 foobarsed '2d' file.txt 删除文件中的第二行。 sed -i 's/foo/bar/g' file.txt 直接在文件中替换所有的 foobar
awk 强大的文本处理工具 - 按列处理文本数据 - 复杂的模式匹配与处理 - 进行文本分析、统计、格式化输出 awk '{print $1, $2}' file.txt 打印 file.txt 文件中的第 1 列和第 2 列。 awk '$3 > 50 {print $1, $3}' file.txt 打印第三列大于 50 的行的第 1 列和第 3 列。
  • grep: 主要用于 查找文本,是最快速的文本查找工具,适合用来在大文件中搜索特定内容。
  • sed: 用于 流编辑,更适合 文本替换删除行,在对文件内容进行批量修改时非常有用。
  • awk: 强大的 文本处理 工具,特别适合处理 结构化数据(例如按列处理),可用于文本分析、统计以及格式化输出。

五、实战练习

# 系统日志文件
2025-02-22 08:30:01 INFO User alice logged in
2025-02-22 08:32:15 WARN Low disk space on server
2025-02-22 08:34:40 ERROR Database connection failed
2025-02-22 08:40:50 INFO User bob logged in
2025-02-22 08:42:15 ERROR Invalid password attempt by user charlie
2025-02-22 08:50:10 INFO Server started successfully
2025-02-22 08:51:00 ERROR Failed to load configuration file
2025-02-22 08:52:30 WARN Network latency detected
2025-02-22 08:55:00 INFO User dave logged in

# 学生成绩单
ID,Name,Subject,Score
001,John,Math,88
002,Jane,Math,92
003,Bob,Science,85
004,Lucy,History,78
005,Mark,Math,95
006,Paul,Science,82
007,Lily,History,90
008,Tom,Math,76
009,Anna,Science,88
010,James,History,84

# 员工信息表
ID,Name,Department,Salary
001,John,HR,5000
002,Jane,IT,7500
003,Bob,Finance,6000
004,Lucy,IT,8000
005,Mark,HR,5500
006,Paul,Finance,6500
007,Lily,HR,5800
008,Tom,Finance,7000
009,Anna,IT,8500
010,James,HR,6000

# 用户访问记录
UserID,Username,Action,Date,Time
101,alice,login,2025-02-22,08:30:01
102,bob,view,2025-02-22,08:32:15
103,charlie,login,2025-02-22,08:34:40
104,david,logout,2025-02-22,08:40:50
105,ellen,view,2025-02-22,08:42:15
106,frank,login,2025-02-22,08:50:10
107,grace,view,2025-02-22,08:51:00
108,henry,logout,2025-02-22,08:52:30

# 访问日志
192.168.1.1 - - [22/Feb/2025:08:30:01 +0000] "GET /index.html HTTP/1.1" 200 2326
192.168.1.2 - - [22/Feb/2025:08:32:15 +0000] "POST /login HTTP/1.1" 302 521
192.168.1.3 - - [22/Feb/2025:08:34:40 +0000] "GET /products HTTP/1.1" 404 712
192.168.1.4 - - [22/Feb/2025:08:40:50 +0000] "GET /contact HTTP/1.1" 200 1823
192.168.1.5 - - [22/Feb/2025:08:42:15 +0000] "POST /register HTTP/1.1" 500 1345
192.168.1.6 - - [22/Feb/2025:08:50:10 +0000] "GET /about HTTP/1.1" 200 1426
192.168.1.7 - - [22/Feb/2025:08:51:00 +0000] "GET /services HTTP/1.1" 200 2280
192.168.1.8 - - [22/Feb/2025:08:52:30 +0000] "POST /checkout HTTP/1.1" 301 602

综合练习题目

  1. 使用 grep:
  • 查找所有日志文件中出现的 ERROR
  • 递归查找包含 “Math” 的成绩记录。
  • 查找 访问日志 中所有响应状态码为 200 的请求。
  • 查找 用户访问记录 中所有登录(login)的操作。
  1. 使用 sed:
  • 将成绩单中的 “Math” 替换为 “Mathematics”。
  • 删除员工信息表中的第 4 行。
  • sed 将所有日志中的 INFO 替换为 INFORMATION
  • 将访问日志中每条记录的 IP 地址后面加上一个注释 # Accessed
  1. 使用 awk:
  • 计算所有学生的平均成绩。
  • 统计每个部门的员工数量,并按员工数量降序排列。
  • 打印所有 用户访问记录actionlogin 的用户。
  • 打印 访问日志 中所有响应状态为 200 的行,并只显示 IP 地址和响应时间(即删除多余的字段)。
  • 打印 访问日志 中每个 IP 地址的访问次数。
  1. 综合操作:
  • 从系统日志中查找所有 ERROR 相关的日志行,然后用 awk 打印出所有出错信息的时间(日期)。
  • 统计每个部门员工的总薪水,按照薪水总和从高到低排列。
  • 用户访问记录 文件进行数据清理,删除所有 logout 的记录,剩下的记录按时间排序。