运维和开发日常高频使用,用好管道与重定向,可以把多个命令串联、灵活控制命令输入输出,是Linux命令行的核心基本功。
一、基础概念
Linux 程序默认有3个标准流:
- 标准输入 stdin(0):程序读取的数据,默认来自键盘
- 标准输出 stdout(1):程序正常打印的信息,默认输出到屏幕
- 标准错误 stderr(2):程序报错信息,默认输出到屏幕
重定向 :改变输入、输出的流向,不打印到屏幕,写入文件或者从文件读取。
管道 | :把前一个命令的标准输出 ,直接当做后一个命令的标准输入,命令接力执行。
二、重定向详解 + 常用参数
1. 输出重定向 > 覆盖写入
语法:命令 > 文件
作用:将标准输出写入文件,文件原有内容会被清空覆盖
bash
# 将ls结果写入list.txt,覆盖原有内容
ls -l > list.txt
⚠️ 风险提示:
>是覆盖,不要误操作写入重要文件!
2. 追加输出重定向 >>
语法:命令 >> 文件
作用:标准输出追加到文件末尾,不会清空原有内容,日志收集最常用
bash
# 把日期追加到日志文件
date >> run.log
3. 错误重定向 2> / 2>>
2 代表标准错误stderr
bash
# 错误信息覆盖写入err.log,正常输出依旧打印屏幕
cat nofile.txt 2> err.log
# 错误信息追加写入err.log
cat nofile.txt 2>> err.log
4. 标准输出+错误输出一起重定向(高频)
bash
# 写法1:stdout和stderr都覆盖写入到all.log(推荐新版)
ls test/ > all.log 2>&1
# 写法2(bash支持简写 &>)
ls test/ &> all.log
# 追加写法
ls test/ >> all.log 2>&1
ls test/ &>> all.log
说明:
2>&1含义:把错误输出绑定到标准输出的流向,必须写在>后面,顺序不能颠倒。
5. 输入重定向 <
语法:命令 < 文件,让命令从文件读取输入,而不是键盘
bash
# 从user.txt读取内容给wc统计行数
wc -l < user.txt
还有 here-doc <<,脚本里经常用来批量输入多行:
bash
cat << EOF > info.txt
姓名:test
环境:linux
EOF
EOF 是自定义结束标记,中间所有内容都会写入文件。
6. 空设备 /dev/null
黑洞设备,丢数据专用,丢弃不想要的输出(静默执行命令)
bash
# 正常输出、报错全部扔掉,屏幕无任何打印
ls test &> /dev/null
三、管道 | 详解
语法:命令A | 命令B
注意:管道只传递标准输出stdout,默认不传递stderr;管道传递的是数据流,不是参数!
常用管道示例
bash
# 查看进程,过滤nginx
ps -ef | grep nginx
# 统计目录文件数量
ls | wc -l
# 分页查看长输出(less支持上下翻页,q退出)
cat /var/log/messages | less
# 去重+排序
cat data.txt | sort | uniq
# 查看端口,过滤80端口
ss -tulnp | grep 80
管道组合进阶
多管道可以连续串联,一条流水线处理数据:
bash
# 取出日志包含error的行,统计行数
cat app.log | grep error | wc -l
补充:管道与xargs(容易踩坑)
很多命令不接收管道输入 (rm、ls、mkdir这类,只接收参数),这时搭配 xargs,把管道输出转为命令参数:
bash
# 查找txt文件,批量删除
find ./ -name "*.txt" | xargs rm -f
# 批量查看文件详情
find ./ -name "*.log" | xargs ls -l
区分:
grep、wc、less:可以接收管道输入rm、cp、mkdir:不能直接接收管道,需要 xargs
四、重定向 + 管道组合实战示例
bash
# 过滤日志里的warn,结果保存到warn.log,同时屏幕也能看到(tee命令)
cat app.log | grep WARN | tee warn.log
# 过滤error日志,追加到error.log,错误丢弃
cat app.log | grep ERROR >> error.log 2>/dev/null
tee 是一个很实用的命令:一边输出到屏幕,一边写入文件,适合一边看结果一边保存。
五、常见坑点总结
>和>>不要搞混,覆盖会丢数据,收集日志一律优先>>2>&1顺序不能写反,不能写成2>1&- 管道默认不传错误流,如果想把错误也进管道:
命令 2>&1 | grep xxx - 管道传递是数据流,不是文件名参数,rm/cp 等要用xargs
&>是bash特有简写,sh环境不一定支持,兼容脚本优先写> file 2>&1- here-doc的结束标记EOF前后不能有空格,否则识别失败
六、快速速查表
| 符号 | 作用 |
|---|---|
> |
标准输出,覆盖写入文件 |
>> |
标准输出,追加写入 |
2> |
错误输出,覆盖 |
2>> |
错误输出,追加 |
2>&1 |
错误输出合并到标准输出 |
< |
输入重定向,从文件读入 |
<< EOF |
多行文本输入 |
| ` | ` |
&> |
stdout+stderr 重定向(bash简写) |
/dev/null |
数据黑洞,丢弃输出 |
tee |
分流:屏幕输出 + 写入文件 |
xargs |
将管道输出转为命令参数 |
管道和重定向是shell脚本、日志筛选、数据处理的基石,后面写自动化脚本、日志分析都会高频用到。