前言:文本三剑客一般指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 文件中第一次出现的 foo 为 bar 。 sed '2d' file.txt 删除文件中的第二行。 sed -i 's/foo/bar/g' file.txt 直接在文件中替换所有的 foo 为 bar 。 |
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
综合练习题目
- 使用
grep
:
- 查找所有日志文件中出现的
ERROR
。 - 递归查找包含 “Math” 的成绩记录。
- 查找
访问日志
中所有响应状态码为200
的请求。 - 查找
用户访问记录
中所有登录(login
)的操作。
- 使用
sed
:
- 将成绩单中的 “Math” 替换为 “Mathematics”。
- 删除员工信息表中的第 4 行。
- 用
sed
将所有日志中的INFO
替换为INFORMATION
。 - 将访问日志中每条记录的 IP 地址后面加上一个注释
# Accessed
。
- 使用
awk
:
- 计算所有学生的平均成绩。
- 统计每个部门的员工数量,并按员工数量降序排列。
- 打印所有
用户访问记录
中action
为login
的用户。 - 打印
访问日志
中所有响应状态为200
的行,并只显示 IP 地址和响应时间(即删除多余的字段)。 - 打印
访问日志
中每个 IP 地址的访问次数。
- 综合操作:
- 从系统日志中查找所有
ERROR
相关的日志行,然后用awk
打印出所有出错信息的时间(日期)。 - 统计每个部门员工的总薪水,按照薪水总和从高到低排列。
- 对
用户访问记录
文件进行数据清理,删除所有logout
的记录,剩下的记录按时间排序。