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

  |   0 评论   |   0 浏览

大家好,欢迎回到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 – 将管道输出转为命令参数

管道传递的是标准输入 ,但有些命令(如 rmmkdir)不接受标准输入,只接受命令行参数。这时就需要 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)是一种用于匹配文本模式的强大语言。grepsedawk 等工具都支持正则表达式。

4.1 基础正则表达式元字符

元字符含义示例
.匹配任意单个字符(除换行符)a.c 匹配 abcaAc
*匹配前面的字符0次或多次a* 匹配 ""aaa
.*匹配任意多个字符(贪婪)a.*b 匹配 aba123b
^匹配行首^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\} 匹配 aaaaaaaaa

4.2 扩展正则表达式(grep -Eegrep

扩展正则增加了更便捷的语法,部分元字符不再需要反斜杠:

元字符含义示例
+匹配前一个字符1次或多次a+ 匹配 aaaaaa
?匹配前一个字符0次或1次https? 匹配 httphttps
|或(逻辑或)error|warning 匹配 error 或 warning
()分组(abc)+ 匹配 abcabcabc
{n}匹配 n 次(无需反斜杠)a{3} 匹配 aaa
{n,}至少 n 次a{2,} 匹配 aaaaa...
{n,m}n 到 m 次a{2,4} 匹配 aaaaaaaaa

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

总结

本篇我们学习了三个核心概念:

  1. 重定向 :将命令的输入输出导向文件或其他设备,包括正确输出、错误输出、输入重定向。
  2. 管道 :连接命令,将一个命令的输出作为另一个命令的输入,实现命令组合。
  3. 正则表达式 :强大的文本模式匹配语言,配合 grep 可以实现复杂的搜索和过滤任务。

这些技术是Linux命令行的灵魂,掌握它们之后,你会发现很多看似复杂的任务只需要一行命令就能完成。日常工作中多思考、多组合,你的命令行技能会越来越娴熟。

下一篇我们将进入用户管理和权限控制,这是Linux安全的基础,敬请期待!


练习建议

  1. lsgrep 找出当前目录下所有以 .conf 结尾的文件。
  2. 使用 ps auxgrep 找出所有 nginx 进程,排除 grep 自身。
  3. 写一个正则表达式匹配手机号码(11位数字,以1开头)。
  4. 使用 catHere Document 创建一个包含多行配置的文件。

标题:RHCE认证考试学习笔记(三):重定向、管道与正则表达式
作者:shuaiqijun
地址:https://shuaiqijun.com/articles/2026/03/23/1774228991978.html