Linux 管道、重定向命令介绍

运维和开发日常高频使用,用好管道与重定向,可以把多个命令串联、灵活控制命令输入输出,是Linux命令行的核心基本功。

一、基础概念

Linux 程序默认有3个标准流:

  1. 标准输入 stdin(0):程序读取的数据,默认来自键盘
  2. 标准输出 stdout(1):程序正常打印的信息,默认输出到屏幕
  3. 标准错误 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 是一个很实用的命令:一边输出到屏幕,一边写入文件,适合一边看结果一边保存。

五、常见坑点总结

  1. > 和 >> 不要搞混,覆盖会丢数据,收集日志一律优先 >>
  2. 2>&1 顺序不能写反,不能写成 2>1&
  3. 管道默认不传错误流,如果想把错误也进管道:命令 2>&1 | grep xxx
  4. 管道传递是数据流,不是文件名参数,rm/cp 等要用xargs
  5. &> 是bash特有简写,sh环境不一定支持,兼容脚本优先写 > file 2>&1
  6. here-doc的结束标记EOF前后不能有空格,否则识别失败

六、快速速查表

符号 作用
> 标准输出,覆盖写入文件
>> 标准输出,追加写入
2> 错误输出,覆盖
2>> 错误输出,追加
2>&1 错误输出合并到标准输出
< 输入重定向,从文件读入
<< EOF 多行文本输入
` `
&> stdout+stderr 重定向(bash简写)
/dev/null 数据黑洞,丢弃输出
tee 分流:屏幕输出 + 写入文件
xargs 将管道输出转为命令参数

管道和重定向是shell脚本、日志筛选、数据处理的基石,后面写自动化脚本、日志分析都会高频用到。

相关推荐
江华森8 小时前
数据中心网络技术基础 —— 从原理到实操
linux·运维
yz_aiks9 小时前
chrome-use 使用教程:让 Claude Code 操控已登录的 Chrome(禅道、ONES 实测)
chrome·自动化·大模型·ai agent
网络小江9 小时前
组网第41课:ACL 门禁——标准/扩展、规则顺序、time-range、in/out 方向
运维·网络安全·acl·访问列表·in/out
super_Omni9 小时前
Chrome 插件入驻实战:从 Manifest V3 到过审上架的完整路径
大数据·前端·chrome
牛马工作号9 小时前
Copyparty 轻量文件共享:Docker Compose 部署、权限与多协议使用全指南
运维·docker·容器
骑着蜗牛撵大象3279 小时前
手写一个 HTTP 服务器:从 socket 到 epoll,Linux 上到底怎么把请求变成响应
linux·服务器·网络·http·epoll·socket编程·并发模型
程序员初一9 小时前
我在 1C1G 的服务器上装了个桌面环境,然后用 VNC 连它,然后我后悔了
linux·ssh
星恒随风10 小时前
Linux Socket TCP编程(二):逐文件重构多进程、多线程与线程池服务器,深入fork、pthread_create、popen和std::bind
linux·服务器·笔记·学习·tcp/ip
晚风叙码10 小时前
Linux 进程概念(下):程序地址空间与虚拟内存
linux·服务器·算法