Linux基础及应用教程:文本三剑客之 grep
grep 是 Linux 文本处理三剑客之一,用于查找、过滤、正则匹配和日志分析,是运维工程师、文本处理人员必学工具。
一、实验目标
- 掌握 grep 的基础查找功能
- 理解大小写忽略、反向匹配、行号显示等常用参数
- 能使用正则表达式进行高级匹配
- 掌握递归搜索目录/日志的方法
- 理解 grep 在实际日志分析中的典型用法
二、实验环境
- 平台:VMware 虚拟机
- 系统:CentOS 7 / 8
- 普通用户:
njucm(密码 123456) - root 密码:
123456
三、实验内容与步骤
实验准备
创建实验目录并准备测试文本。
mkdir -p ~/grep_lab
cd ~/grep_lab
# simple.txt
cat > simple.txt << EOF
Hello World
hello world
HELLO WORLD
This is a grep test file.
Linux is powerful.
Text filtering with grep is easy.
EOF
# logs.txt
cat > logs.txt << EOF
2024-01-01 INFO User login success
2024-01-01 ERROR Cannot connect to database
2024-01-02 WARN Disk space low
2024-01-03 ERROR File not found
2024-01-04 INFO Task finished
EOF
# data.txt
cat > data.txt << EOF
apple
banana
orange
grape
pineapple
blueberry
blackberry
EOF
任务1:grep 基础搜索
最基本的查找文本中包含某字符串的行。
grep "hello" simple.txt
grep "INFO" logs.txt
任务2:忽略大小写 -i
grep -i "hello" simple.txt
任务3:行号与计数(-n / -c)
grep -n "ERROR" logs.txt
grep -c "ERROR" logs.txt
任务4:反向查找 -v
grep -v "INFO" logs.txt
任务5:整行匹配 -x
grep -x "apple" data.txt
任务6:正则表达式匹配
使用 grep -E 或 egrep 启用扩展正则。
# 开头匹配
grep "^2024" logs.txt
# 结尾匹配
grep "success$" logs.txt
# 任意字符
grep ".... error" simple.txt
# 字符集匹配
grep "b[a-z]nana" data.txt
# 扩展正则
grep -E "apple|banana" data.txt
grep -E "^(ERROR|WARN)" logs.txt
任务7:递归搜索目录 -r
mkdir -p nested/logs
cp logs.txt nested/logs/log1.txt
cp logs.txt nested/logs/log2.txt
grep -r "ERROR" nested/
任务8:高亮显示 --color
grep --color=auto "ERROR" logs.txt
任务9:结合管道使用
grep "ERROR" logs.txt | sort
grep "ERROR" logs.txt | grep -v "database"
grep "ERROR" logs.txt | wc -l
任务10:长度匹配练习
grep -E "^.{7,}$" data.txt
综合实操练习
找出:所有 ERROR 且日期为 2024-01-01 且不包含 database 的日志。
grep "2024-01-01" logs.txt \
| grep "ERROR" \
| grep -v "database"
四、实验报告要求
- 截图记录每个任务运行结果
- 总结 grep 常用参数:-i、-n、-v、-E、-r 等
- 写出不少于 5 个正则匹配示例
- 设计至少一个“多重过滤”命令并解释其作用
五、常见问题解答
- Q:grep 默认是否使用正则?
A:是,但默认是基础正则(BRE)。扩展正则要用
-E。 - Q:为什么搜索区分大小写?
A:默认大小写敏感,可使用
-i。 - Q:grep 搜索目录时报错 "Is a directory"?
A:需使用
-r递归模式。 - Q:如何匹配多个关键词?
A:使用
grep -E "k1|k2"或多次管道。