跳转到内容

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:李四 市场部 工号1002

1. 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: admin

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

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

3. 管道符:命令连接利器

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.log

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

4. 命令组合实战

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
6

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

5. 性能优化技巧

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

5. 3 使用xargs处理大量文件

bash
# 不推荐:直接使用rm
$ find /tmp -name "*.tmp" | xargs rm

# 推荐:限制并发数
$ find /tmp -name "*.tmp" | xargs -P 4 rm

grep命令选项

选项功能
-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组合来统计和排序。


评论区

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