RHCE认证考试学习笔记(三):重定向、管道与正则表达式

大家好,欢迎回到RHCE9学习笔记系列。在前两篇文章中,我们学习了Linux的基础概念、目录结构以及文件操作命令。今天,我们将进入命令行的高级技巧领域:输入输出重定向 、管道 以及正则表达式 。掌握这些技术,你就能将简单的命令组合成强大的工作流,像搭积木一样解决复杂问题。
1. 输入输出重定向
在Linux中,每个命令都有三个标准的数据流:
| 名称 | 文件描述符 | 说明 |
|---|---|---|
| 标准输入 (stdin) | 0 | 默认从键盘读取 |
| 标准输出 (stdout) | 1 | 默认输出到屏幕 |
| 标准错误 (stderr) | 2 | 默认也输出到屏幕 |
重定向的作用就是改变这些数据流的去向,比如将输出保存到文件、忽略错误信息,或者将文件内容作为命令的输入。
1.1 输出重定向
输出重定向是最常用的功能,将命令的输出写入文件而不是显示在屏幕上。
正确输出重定向(> 和 >>)
>:覆盖写入(若文件存在则覆盖)>>:追加写入(若文件存在则追加到末尾)
bash
# 将 ls 的结果保存到 list.txt(覆盖)
ls > list.txt
# 追加当前目录的路径到同一文件
pwd >> list.txt
# 查看结果
cat list.txt
错误输出重定向(2> 和 2>>)
有时候命令会产生错误信息,我们可能需要单独处理它们:
bash
# 将错误信息保存到 error.log
ls /root/ 2> error.log
# 将错误信息追加到文件
ls /nonexist 2>> error.log
同时重定向正确和错误输出
bash
# 将正确和错误都保存到同一个文件(覆盖)
ls /root /etc > all.log 2>&1
# 简写方式(覆盖)
ls /root /etc &> all.log
# 追加方式
ls /root /etc &>> all.log
# 将正确和错误分别重定向到不同文件
ls /root /etc > correct.log 2> error.log
丢弃输出:/dev/null
/dev/null 是一个特殊的设备文件,所有写入它的内容都会被丢弃(类似黑洞)。常用于忽略不需要的输出:
bash
# 执行命令,不显示任何输出
command > /dev/null 2>&1
# 或简写
command &> /dev/null
1.2 输入重定向(< 和 <<)
输入重定向将文件内容作为命令的输入,而不是从键盘输入。
从文件读取输入
bash
# 将 file.txt 作为 cat 的输入
cat < file.txt
# 统计文件行数
wc -l < file.txt
Here Document(<<)
<< 允许你创建一个临时的"文档"作为输入,直到遇到指定的结束符:
bash
# 将多行文本作为输入
cat << EOF
这是第一行
这是第二行
这是第三行
EOF
# 常用场景:创建配置文件
cat > config.conf << END
server=192.168.1.1
port=8080
timeout=30
END
小技巧 :用 <<- 可以忽略每行开头的制表符(Tab),方便在脚本中格式化。
2. 管道(|)
管道是Linux命令行最强大的特性之一。它的作用是将左边命令的输出作为右边命令的输入。
2.1 基本用法
bash
# 查看 /etc 目录内容,并分页显示
ls -l /etc | less
# 统计当前目录下有多少个文件
ls | wc -l
# 查找包含特定关键词的进程
ps aux | grep ssh
2.2 管道组合实例
bash
# 找出最大的10个文件
du -sh * | sort -rh | head -10
# 统计访问日志中IP地址的出现次数,按频率排序
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr
# 查看系统所有TCP连接状态统计
netstat -ant | awk '/^tcp/ {print $6}' | sort | uniq -c | sort -nr
2.3 xargs – 将管道输出转为命令参数
管道传递的是标准输入 ,但有些命令(如 rm、mkdir)不接受标准输入,只接受命令行参数。这时就需要 xargs:
bash
# 错误:无法工作,rm 不读标准输入
ls *.log | rm
# 正确:xargs 将文件列表作为参数传给 rm
ls *.log | xargs rm
# 查找并删除所有 .tmp 文件
find . -name "*.tmp" | xargs rm -f
# 限制每次传递的参数个数(例如每批5个)
echo file{1..100}.txt | xargs -n 5 rm
注意 :文件名包含空格或特殊字符时,建议使用 xargs -0 配合 find -print0,以空字符分隔。
3. grep – 文本搜索利器
grep 是全局正则表达式打印(Global Regular Expression Print)的缩写,用于在文件或标准输入中搜索匹配的行。
3.1 基本用法
bash
# 在 /etc/passwd 中搜索包含 root 的行
grep root /etc/passwd
# 从管道中搜索
ps aux | grep nginx
3.2 常用选项
| 选项 | 说明 |
|---|---|
-i | 忽略大小写 |
-v | 反向匹配(显示不包含关键词的行) |
-n | 显示行号 |
-r | 递归搜索目录 |
-l | 只显示包含匹配的文件名 |
-c | 统计匹配的行数 |
-A n | 显示匹配行及其后 n 行(After) |
-B n | 显示匹配行及其前 n 行(Before) |
-C n | 显示匹配行及其前后各 n 行(Context) |
3.3 实用示例
bash
# 在 /var/log 下递归搜索错误日志
grep -r "ERROR" /var/log/
# 统计 /etc 下有多少配置文件包含 "password"
grep -r "password" /etc/ | wc -l
# 显示匹配行及其前后各2行
grep -C 2 "error" log.txt
# 查找非注释行(排除以 # 开头的行)
grep -v "^#" config.conf
# 查找空行
grep "^$" file.txt
4. 正则表达式
正则表达式(Regular Expression)是一种用于匹配文本模式的强大语言。grep、sed、awk 等工具都支持正则表达式。
4.1 基础正则表达式元字符
| 元字符 | 含义 | 示例 |
|---|---|---|
. | 匹配任意单个字符(除换行符) | a.c 匹配 abc、aAc |
* | 匹配前面的字符0次或多次 | a* 匹配 ""、a、aa |
.* | 匹配任意多个字符(贪婪) | a.*b 匹配 ab、a123b |
^ | 匹配行首 | ^root 匹配以 root 开头的行 |
$ | 匹配行尾 | bash$ 匹配以 bash 结尾的行 |
^$ | 匹配空行 | 常用于过滤空行 |
[abc] | 匹配方括号中的任意一个字符 | [aeiou] 匹配任意元音字母 |
[^abc] | 匹配不在方括号中的字符 | [^0-9] 匹配非数字 |
[a-z] | 匹配范围 | [0-9] 匹配任意数字 |
\ | 转义特殊字符 | \. 匹配点号本身 |
\{n\} | 匹配前一个字符恰好 n 次 | a\{3\} 匹配 aaa |
\{n,m\} | 匹配前一个字符 n 到 m 次 | a\{2,4\} 匹配 aa、aaa、aaaa |
4.2 扩展正则表达式(grep -E 或 egrep)
扩展正则增加了更便捷的语法,部分元字符不再需要反斜杠:
| 元字符 | 含义 | 示例 |
|---|---|---|
+ | 匹配前一个字符1次或多次 | a+ 匹配 a、aa、aaa |
? | 匹配前一个字符0次或1次 | https? 匹配 http 和 https |
| | 或(逻辑或) | error|warning 匹配 error 或 warning |
() | 分组 | (abc)+ 匹配 abc、abcabc |
{n} | 匹配 n 次(无需反斜杠) | a{3} 匹配 aaa |
{n,} | 至少 n 次 | a{2,} 匹配 aa、aaa... |
{n,m} | n 到 m 次 | a{2,4} 匹配 aa、aaa、aaaa |
4.3 正则表达式实战
匹配 IP 地址
bash
# 匹配 IPv4 地址(简化版)
grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" file.txt
匹配邮箱地址
bash
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" file.txt
匹配日期格式 YYYY-MM-DD
bash
grep -E "[0-9]{4}-[0-9]{2}-[0-9]{2}" file.txt
过滤配置文件的注释和空行
bash
# 显示有效配置行(排除注释和空行)
grep -v "^#" /etc/nginx/nginx.conf | grep -v "^$"
# 等效写法,使用扩展正则
grep -Ev "^(#|$)" /etc/nginx/nginx.conf
4.4 grep 与其他命令的组合
bash
# 查找所有 shell 脚本文件中的错误信息(忽略大小写)
find . -name "*.sh" | xargs grep -i "error"
# 从日志中提取 ERROR 级别日志及其上下文
grep -B 2 -A 5 "ERROR" app.log
# 统计各类 HTTP 状态码的数量
grep -oE "HTTP/[0-9.]+ [0-9]{3}" access.log | cut -d" " -f2 | sort | uniq -c
5. 综合实战
让我们结合所学知识,完成一个实用的任务:分析系统日志并生成报告 。
bash
# 1. 查找所有 failed login 记录(忽略大小写)
grep -i "failed password" /var/log/secure > failed.log
# 2. 提取源IP地址(假设日志格式包含 from <IP> 或类似)
grep -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" failed.log > ips.txt
# 3. 统计每个IP的失败次数,按降序排列
sort ips.txt | uniq -c | sort -nr > failed_count.txt
# 4. 将结果保存并打印
echo "=== Failed Login Summary ===" > report.txt
cat failed_count.txt >> report.txt
cat report.txt
总结
本篇我们学习了三个核心概念:
- 重定向 :将命令的输入输出导向文件或其他设备,包括正确输出、错误输出、输入重定向。
- 管道 :连接命令,将一个命令的输出作为另一个命令的输入,实现命令组合。
- 正则表达式 :强大的文本模式匹配语言,配合
grep可以实现复杂的搜索和过滤任务。
这些技术是Linux命令行的灵魂,掌握它们之后,你会发现很多看似复杂的任务只需要一行命令就能完成。日常工作中多思考、多组合,你的命令行技能会越来越娴熟。
下一篇我们将进入用户管理和权限控制,这是Linux安全的基础,敬请期待!
练习建议 :
- 用
ls和grep找出当前目录下所有以.conf结尾的文件。 - 使用
ps aux和grep找出所有nginx进程,排除grep自身。 - 写一个正则表达式匹配手机号码(11位数字,以1开头)。
- 使用
cat和Here Document创建一个包含多行配置的文件。
标题:RHCE认证考试学习笔记(三):重定向、管道与正则表达式
作者:shuaiqijun
地址:https://www.shuaiqijun.com/articles/2026/03/23/1774228991978.html