跳转到主要内容
模块 3 · 第 2 课(共 2)课程中的7/11~15 min
模块课程(2/2)

管道和过滤器(grep 和 |)

Linux 命令行最强大的功能之一是能够连接不同的命令,以便一个命令的输出成为下一个命令的输入。此技术是使用 管道 完成的,并且通常与文本过滤命令 grep 配对。


过滤文本:grep

grep(全局正则表达式打印)命令在一个或多个文件中搜索特定的文本字符串并打印匹配的行:

Bash
grep "string" [file_name]

grep 的有用选项

  • grep -i "error" server.log:执行 不区分大小写 搜索(忽略大小写之间的差异,查找“Error”、“error”或“ERROR”)。
  • grep -n "connection" server.log:显示行号以及匹配行。
  • grep -v "INFO" server.log:反转搜索,仅显示不包含指定关键字的行。

链接命令:管道 |

管道运算符由竖线 | 表示。它将左侧命令的标准输出直接发送到右侧命令的标准输入:

Bash
[command1] | [command2]

例如,如果日志文件很大,并且您想要搜索特定单词而不打印整个文件,则可以组合 cat 和 grep:

Bash
cat logs/server.log | grep ERROR

这会使用 cat 读取整个 server.log 文件,但不是将其打印到屏幕,而是通过管道将流传输到 grep,后者仅过滤并显示包含单词“ERROR”的行。


使用示例和常见错误

如果您在仅包含大写字母(例如“POST”)的文件中搜索小写单词(例如“post”),则 grep 将不会返回任何内容:

Bash
grep "post" logs/access.log
# Output: (no results, search is case-sensitive by default)

要查找该行(无论大小写),请使用 -i 标志:

Bash
grep -i "post" logs/access.log
# Output:
# 127.0.0.1 - - [22/May/2026:10:10:00 +0000] "POST /login HTTP/1.1" 401 234

如果指定的文件不存在,grep将返回错误:

Bash
grep "ERROR" nonexistent_file.log
# Output:
# grep: nonexistent_file.log: No such file or directory

自己尝试一下

练习 1:在日志文件中搜索错误

锻炼#linux.m3.l2.e1
尝试:0加载中...

过滤文件“logs/server.log”以仅提取并显示包含单词“ERROR”(区分大小写)的行。

正在加载编辑器...
显示提示

使用 grep 命令,后跟要搜索的单词和文件路径。

3 次尝试后可用的解决方案

练习 2:管道和过滤器

锻炼#linux.m3.l2.e2
尝试:0加载中...

使用 cat 命令读取文件“logs/server.log”,并将其输出通过管道 (|) 传送到 grep 命令,以仅过滤和打印包含单词“WARNING”的行。

正在加载编辑器...
显示提示

使用管道“|”将 cat logs/server.log 连接到 grep WARNING特点。

3 次尝试后可用的解决方案

练习 3:不区分大小写的搜索

锻炼#linux.m3.l2.e3
尝试:0加载中...

使用适当的 grep 标志在“logs/access.log”文件中搜索包含单词“post”(大写或小写)的所有行。

正在加载编辑器...
显示提示

使用带有 -i 选项的 grep 可以忽略大小写。

3 次尝试后可用的解决方案