大家好,欢迎回到RHCE9学习笔记系列。在前两篇文章中,我们学习了Linux的基础概念、目录结构以及文件操作命令。今天,我们将进入命令行的高级技巧领域:输入输出重定向、管道以及正则表达式。掌握这些技术,你就能将简单的命令组合成强大的工作流,像搭积木一样解决复杂问题。
1. 输入输出重定向
在Linux中,每个命令都有三个标准的数据流:
重定向的作用就是改变这些数据流的去向,比如将输出保存到文件、忽略错误信息,或者将文件内容作为命令的输入。
1.1 输出重定向
输出重定向是最常用的功能,将命令的输出写入文件而不是显示在屏幕上。
正确输出重定向(> 和 >>)
>:覆盖写入(若文件存在则覆盖)
>>:追加写入(若文件存在则追加到末尾)
bash
# 将ls的结果保存到 list.txt(覆盖)ls > list.txt# 追加当前目录的路径到同一文件pwd >> list.txt# 查看结果cat list.txt
错误输出重定向(2> 和 2>>)
有时候命令会产生错误信息,我们可能需要单独处理它们:
bash
# 将错误信息保存到 error.logls /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 << ENDserver=192.168.1.1port=8080timeout=30END
小技巧:用 <<- 可以忽略每行开头的制表符(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 将文件列表作为参数传给 rmls *.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 常用选项
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 |
* | | a* |
.* | | a.*b |
^ | | ^root |
$ | | bash$ |
^$ | | |
[abc] | | [aeiou] |
[^abc] | | [^0-9] |
[a-z] | | [0-9] |
\ | | \. |
\{n\} | | a\{3\} |
\{n,m\} | | a\{2,4\} |
4.2 扩展正则表达式(grep -E 或 egrep)
扩展正则增加了更便捷的语法,部分元字符不再需要反斜杠:
| | |
|---|
+ | | a+ |
? | | https? |
| | | error|warning |
() | | (abc)+ |
{n} | | a{3} |
{n,} | | a{2,} |
{n,m} | | a{2,4} |
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.txtcat failed_count.txt >> report.txtcat report.txt
总结
本篇我们学习了三个核心概念:
重定向:将命令的输入输出导向文件或其他设备,包括正确输出、错误输出、输入重定向。
管道:连接命令,将一个命令的输出作为另一个命令的输入,实现命令组合。
正则表达式:强大的文本模式匹配语言,配合 grep 可以实现复杂的搜索和过滤任务。
这些技术是Linux命令行的灵魂,掌握它们之后,你会发现很多看似复杂的任务只需要一行命令就能完成。日常工作中多思考、多组合,你的命令行技能会越来越娴熟。
下一篇我们将进入用户管理和权限控制,这是Linux安全的基础,敬请期待!
练习建议:
用 ls 和 grep 找出当前目录下所有以 .conf 结尾的文件。
使用 ps aux 和 grep 找出所有 nginx 进程,排除 grep 自身。
写一个正则表达式匹配手机号码(11位数字,以1开头)。
使用 cat 和 Here Document 创建一个包含多行配置的文件。