主题
grep、wc命令与管道符详解
课程介绍
接下来我们学习三个实用的命令和管道符。grep用于从文件中过滤包含特定内容的行,比如grep "error" log.txt;wc用于统计文件的行数、单词数、字节数;管道符|能把前一个命令的输出传给后一个命令,比如ls | grep "test"。这三个工具组合使用,能完成复杂的文本处理任务。
1. grep命令:内容过滤工具
1. 1 基础用法
命令介绍
grep命令用于从文件中通过关键字过滤文件的行,是Linux中最常用的文本搜索工具之一。
命令语法
bash
grep [选项] "关键字" 文件路径常用基础选项
| 选项 | 功能描述 |
|---|---|
| -n | 在结果中显示行号 |
实操演示
示例1:基础过滤功能
bash
# 创建测试文件(模拟企业员工信息)
$ touch test.txt
# 由于现在还没有学习文本编辑的方法,所以可以打开图形化界面去填写如下内容
张三 研发部 工号1001
李四 市场部 工号1002
王五 研发部 工号1003# 使用grep过滤包含"研发部"的行
$ grep "研发部" test.txt
张三 研发部 工号1001
王五 研发部 工号1003
# 使用grep过滤包含"工号"的行
$ grep "工号" test.txt
张三 研发部 工号1001
李四 市场部 工号1002
王五 研发部 工号1003
# 使用grep -n显示行号
$ grep -n "市场部" test.txt
2:李四 市场部 工号10021. 2 高级选项
常用高级选项
| 选项 | 功能描述 |
|---|---|
| -i | 忽略大小写 |
| -v | 反向匹配(显示不包含关键字的行) |
| -r | 递归搜索目录 |
| -E | 使用扩展正则表达式 |
| -o | 只输出匹配的部分 |
| -c | 只输出匹配的行数 |
| -l | 只输出包含匹配的文件名 |
| -A n | 显示匹配行及其后n行 |
| -B n | 显示匹配行及其前n行 |
| -C n | 显示匹配行及其前后各n行 |
实操演示
示例2:忽略大小写搜索
bash
# 创建测试文件(模拟服务器日志)
$ cat server.log
[INFO] 2024-01-15 10:00:00 Server started
[ERROR] 2024-01-15 10:01:00 Connection failed
[INFO] 2024-01-15 10:02:00 User login: admin
[error] 2024-01-15 10:03:00 Database connection error
# 忽略大小写搜索error
$ grep -i "error" server.log
[ERROR] 2024-01-15 10:01:00 Connection failed
[error] 2024-01-15 10:03:00 Database connection error示例3:反向匹配
bash
# 显示不包含INFO的行
$ grep -v "INFO" server.log
[ERROR] 2024-01-15 10:01:00 Connection failed
[error] 2024-01-15 10:03:00 Database connection error示例4:显示匹配行及上下文
bash
# 显示匹配行及其前后各1行
$ grep -C 1 "login" server.log
[INFO] 2024-01-15 10:01:00 Connection failed
[INFO] 2024-01-15 10:02:00 User login: admin
[error] 2024-01-15 10:03:00 Database connection error示例5:递归搜索目录
bash
# 在/etc目录下递归搜索包含"root"的文件
$ grep -r "root" /etc
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/group:root:x:0:1. 3 正则表达式应用
示例6:使用扩展正则表达式
bash
# 搜索IP地址
$ grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log
192.168.1.100 - - [15/Jan/2024:10:00:00] "GET /index.html"
10.0.0.1 - - [15/Jan/2024:10:01:00] "POST /login"
# 搜索邮箱地址
$ grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" contacts.txt
zhangsan@company.com
lisi@company.com示例7:多个关键字匹配
bash
# 搜索包含ERROR或error的行
$ grep -E "ERROR|error" server.log
[ERROR] 2024-01-15 10:01:00 Connection failed
[error] 2024-01-15 10:03:00 Database connection error
# 搜索以[INFO]或[WARN]开头的行
$ grep -E "^\[(INFO|WARN)\]" server.log
[INFO] 2024-01-15 10:00:00 Server started
[INFO] 2024-01-15 10:02:00 User login: admin2. wc命令:内容统计工具
2. 1 基础用法
命令介绍
wc命令用于统计文件内容的行数、单词数、字节数等信息。
命令语法
bash
wc [选项] 文件路径常用选项
| 选项 | 功能描述 |
|---|---|
| -c | 统计字节数 |
| -m | 统计字符数 |
| -l | 统计行数 |
| -w | 统计单词数 |
实操演示
示例8:wc命令的基本使用
bash
# 查看test.txt文件内容(员工信息)
$ cat test.txt
张三 研发部 工号1001
李四 市场部 工号1002
王五 研发部 工号1003
# 默认输出(行数 单词数 字节数 文件名)
$ wc test.txt
3 9 63 test.txt
# 统计字节数
$ wc -c test.txt
63 test.txt
# 统计字符数
$ wc -m test.txt
63 test.txt
# 统计行数
$ wc -l test.txt
3 test.txt
# 统计单词数
$ wc -w test.txt
9 test.txt2. 2 高级统计技巧
示例9:统计多个文件
bash
# 统计多个文件的行数
$ wc -l file1.txt file2.txt file3.txt
10 file1.txt
20 file2.txt
30 file3.txt
60 total
# 统计目录下所有.txt文件的总行数
$ wc -l *.txt | tail -1
60 total示例10:结合管道符使用
bash
# 统计目录下文件数量
$ ls | wc -l
15
# 统计当前目录下所有文件的总大小
$ ls -l | awk '{sum+=$5} END {print sum}'
1024000
# 统计包含特定内容的行数
$ grep "ERROR" server.log | wc -l
53. 管道符:命令连接利器
3. 1 基础用法
符号介绍
管道符使用竖线 | 表示,用于将管道符左边命令的结果作为右边命令的输入。
基本语法
bash
命令1 | 命令2功能说明
- 将左边命令的输出结果传递给右边命令作为输入
- 可以连接多个命令,形成命令链
- 极大增强了命令的组合使用能力
实操演示
示例11:管道符的基础应用
bash
# 将cat命令的输出作为grep的输入(过滤研发部员工)
$ cat test.txt | grep "研发部"
张三 研发部 工号1001
王五 研发部 工号1003
# 将cat命令的输出作为wc的输入(统计员工人数)
$ cat test.txt | wc -l
3
# 将ls命令的输出作为grep的输入(查找测试文件)
$ ls | grep "test"
test.txt示例12:管道符的嵌套使用
bash
# 多层管道符连接(查找研发部中工号1001的员工)
$ cat test.txt | grep "研发部" | grep "1001"
张三 研发部 工号1001
# 结合ls和grep查看特定文件(查找包含log的文件)
$ ls -l /var/log | grep "log"
-rw-r--r-- 1 root root 1234 Jan 15 10:30 syslog
-rw-r--r-- 1 root root 5678 Jan 15 10:30 auth.log
-rw-r--r-- 1 root root 9012 Jan 15 10:30 kern.log3. 2 高级组合
复杂命令组合
示例13:多层管道符应用
bash
# 查找并统计ERROR日志数量
$ cat server.log | grep "ERROR" | wc -l
5
# 查找特定时间段的错误日志
$ cat server.log | grep "2024-01-15" | grep "ERROR"
[ERROR] 2024-01-15 10:01:00 Connection failed
[ERROR] 2024-01-15 10:05:00 File not found
# 查找并排序访问量最高的IP
$ cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -5
150 192.168.1.100
98 10.0.0.1
45 172.16.0.1
32 192.168.1.50
20 10.0.0.2示例14:结合其他命令使用
bash
# 查找并删除特定文件
$ find /tmp -name "*.log" | grep "old" | xargs rm
# 查找并压缩日志文件
$ find /var/log -name "*.log" -mtime +7 | xargs gzip
# 查找并统计不同状态的进程数
$ ps aux | awk '{print $8}' | sort | uniq -c | sort -rn
45 S
20 R
5 D
2 Z4. 命令组合实战
4. 1 基础组合
示例15:统计包含特定关键字的行数
bash
# 统计test.txt中包含"研发部"的员工人数
$ cat test.txt | grep "研发部" | wc -l
2
# 统计test.txt中包含"工号"的行数
$ cat test.txt | grep "工号" | wc -l
3示例16:统计过滤结果中的单词数
bash
# 统计包含"研发部"的行中的单词总数
$ cat test.txt | grep "研发部" | wc -w
64. 2 实际运维场景
场景1:日志分析
bash
# 分析服务器访问日志
# 1. 统计访问量最高的页面
$ cat access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -10
# 2. 统计HTTP状态码分布
$ cat access.log | awk '{print $9}' | sort | uniq -c | sort -rn
850 200
45 404
15 500
5 301
# 3. 查找异常访问IP
$ cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | awk '$1 > 100'
150 192.168.1.100
120 10.0.0.1
# 4. 统计特定时间段的访问量
$ cat access.log | grep "15/Jan/2024:10:" | wc -l
250场景2:系统监控
bash
# 监控系统进程
# 1. 查找占用CPU最高的进程
$ ps aux | sort -rnk 3 | head -5
root 1234 15.5 2.1 123456 45678 ? R 10:00 0:15 /usr/bin/python
root 5678 8.2 1.5 98765 34567 ? S 10:00 0:08 /usr/bin/java
# 2. 查找占用内存最高的进程
$ ps aux | sort -rnk 4 | head -5
root 1234 15.5 2.1 123456 45678 ? R 10:00 0:15 /usr/bin/python
root 5678 8.2 1.5 98765 34567 ? S 10:00 0:08 /usr/bin/java
# 3. 统计僵尸进程数量
$ ps aux | grep "Z" | grep -v grep | wc -l
2场景3:文件管理
bash
# 文件系统管理
# 1. 查找并删除空目录
$ find /data -type d -empty | xargs rmdir
# 2. 查找大文件
$ find / -type f -size +100M 2>/dev/null | head -10
/var/log/syslog
/home/user/data.tar.gz
# 3. 统计目录下文件数量
$ find /data -type f | wc -l
1500
# 4. 查找特定权限的文件
$ find /etc -type f -perm 777
/etc/config.conf场景4:用户管理
bash
# 用户信息管理
# 1. 统计系统用户数量
$ cat /etc/passwd | wc -l
25
# 2. 查找特定UID的用户
$ grep ":0:" /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 3. 查找使用bash的用户
$ grep "bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
user1:x:1000:1000:User1:/home/user1:/bin/bash
# 4. 统计登录用户数量
$ who | wc -l
35. 性能优化技巧
5. 1 使用更高效的命令
bash
# 不推荐:多次读取文件
$ cat file.txt | grep "pattern1"
$ cat file.txt | grep "pattern2"
# 推荐:一次读取,多次过滤
$ cat file.txt | grep -E "pattern1|pattern2"5. 2 合理使用管道符
bash
# 避免过多的管道符连接
$ cat file.txt | grep "pattern" | awk '{print $1}' | sort | uniq
# 可以合并部分操作
$ cat file.txt | awk '/pattern/ {print $1}' | sort | uniq5. 3 使用xargs处理大量文件
bash
# 不推荐:直接使用rm
$ find /tmp -name "*.tmp" | xargs rm
# 推荐:限制并发数
$ find /tmp -name "*.tmp" | xargs -P 4 rmgrep命令选项
| 选项 | 功能 |
|---|---|
| -n | 显示行号 |
| -i | 忽略大小写 |
| -v | 反向匹配 |
| -r | 递归搜索 |
| -E | 扩展正则表达式 |
| -o | 只输出匹配部分 |
| -c | 统计匹配行数 |
| -l | 显示匹配文件名 |
| -A n | 显示匹配行后n行 |
| -B n | 显示匹配行前n行 |
| -C n | 显示匹配行前后各n行 |
wc命令选项
| 选项 | 功能 |
|---|---|
| -l | 统计行数 |
| -w | 统计单词数 |
| -c | 统计字节数 |
| -m | 统计字符数 |
常用正则表达式
| 模式 | 说明 |
|---|---|
^ | 行首 |
$ | 行尾 |
. | 任意字符 |
* | 0次或多次 |
+ | 1次或多次 |
? | 0次或1次 |
[abc] | 匹配a、b或c |
[^abc] | 不匹配a、b、c |
\d | 数字 |
\w | 单词字符 |
课程总结
这节课我们学了文本过滤和统计的两个命令,以及管道符。
grep - 过滤文本内容: grep "关键词" 文件 - 查找包含关键词的行 grep -i "error" log.txt - 忽略大小写 grep -v "INFO" log.txt - 反向匹配(不包含INFO的行)
wc - 统计文件内容: wc -l 文件 - 统计行数 wc -w 文件 - 统计单词数 wc -c 文件 - 统计字节数
管道符|: 把左边命令的输出传给右边,比如cat file | grep "pattern"。可以用多个管道符连接命令,实现复杂的数据处理。
课后练习
练习1(基础)
请在Linux终端中执行以下操作:
- 创建一个包含员工信息的文本文件(姓名、部门、工号)
- 使用grep命令过滤出特定部门的员工
- 使用wc命令统计文件中的员工总数
💡 提示:使用echo "内容" > file.txt创建文件。
练习2(进阶)
请尝试:
- 使用grep命令查找系统日志文件中包含"error"或"fail"的行,并统计数量
- 使用管道符连接ls和wc命令,统计当前目录的文件数量
- 结合grep和wc命令,统计包含特定关键字的行数
💡 提示:使用grep -E "pattern1|pattern2"可以匹配多个关键字。
练习3(拓展)
请尝试:
- 结合grep、awk、sort等命令,分析访问日志并找出访问量最高的前10个IP
- 使用find和grep命令,查找并统计系统中所有配置文件的数量
- 编写一个命令组合,监控并统计系统中各个进程的CPU使用情况
💡 提示:可以使用sort | uniq -c | sort -rn组合来统计和排序。