一、IO重定向和管道
stdin:standard input 标准输入
stdout:standard output 标准输出
stderr: standard error 标准错误输出
举例
find /etc/ -name passwd > find.out 将正确的输出重定向在这个find.out文件中
find /etc/ -name passwd 2> find.err 将错误输出重定向这个find.err这个文件中
切记勿重定向覆盖之前的文件,如果是追加的话,请使用 " >> " 这个符号
find /etc/ -name passwd 2 > > find.err
find /etc/ -name passwd 2> /dev/null 将错误输出重定向空文件当中
find /etc/ -name passwd &> find.text &表示所有信息,都重定向到find.text文件中
find /etc/ -name passwd 2>&1 find.text 2>&1将错误信息当作正确信息输出
I/O重定向与管道:LinuxShell的核心数据流控制
二、标准数据流(StandardStreams)
每个Linux命令运行时自动打开三个数据流:
|流名称|文件描述符|默认来源/目标|用途|
|---------|------------|----------------|--------------------|
|stdin|0|键盘|命令的输入数据|
|stdout|1|终端屏幕|命令的正常输出|
|stderr|2|终端屏幕|命令的错误信息|
重定向的本质:改变这些数据流的来源或目标(从键盘/屏幕→文件/设备/其他命令)。
三、I/O重定向详解
1.输出重定向
|操作符|作用|示例|
|-------------|---------------------------------------|-------------------------------|
|>或1>|覆盖写入文件(stdout)|ls>file.txt|
|>>或1>>|追加到文件(stdout)|date>>log.txt|
|2>|覆盖写入错误到文件(stderr)|gcccode.c2>errors.log|
|2>>|追加错误到文件(stderr)|pinghost2>>network.err|
|&>|同时重定向stdout+stderr(覆盖)|command&>output.log|
|&>>|同时重定向stdout+stderr(追加)|script.sh&>>debug.log|
2.输入重定向
|操作符|作用|示例|
|--------|-------------------------------|-------------------------------|
|<|从文件读取stdin|sort<unsorted.txt|
|<<|HereDocument(内联文本)|见下方示例|
|<<<|HereString(字符串输入)|grep"error"<<<"$message"|
HereDocument示例:
bash
mail-s"Reminder"user@example.com<<END
Hello!Meetingstartsat10AM.
Pleasebeontime.
END
3.高级用法
-重定向到文件描述符:
bash
将stderr合并到stdout
command2>&1>output.log
交换stdout和stderr
command3>&11>&22>&3
-丢弃输出(黑洞设备):
bash
command>/dev/null丢弃stdout
command2>/dev/null丢弃stderr
command&>/dev/null丢弃所有输出
---
四、管道(Pipe):|
作用:将一个命令的stdout作为下一个命令的stdin。
|示例命令|说明|
|-----------------------------------|------------------------------------------|
|ls-l\|grep".txt"|列出文件并过滤出.txt文件|
|psaux\|sort-nk4|查看进程并按内存使用排序|
|cataccess.log\|cut-d''-f1\|sort\|uniq-c|统计日志中每个IP的访问次数|
管道vs重定向
|特性|管道(\|)|重定向(>,<)|
|------------|------------------------|------------------------|
|数据方向|命令→命令|命令↔文件/设备|
|数据流|只传递stdout|可控制stdin/stdout/stderr|
|使用场景|命令链式处理|输入/输出到持久化存储|
---
五、关键应用场景
1.日志处理
bash
grep"ERROR"/var/log/syslog|awk'{print$5}'>errors.txt
2.数据转换
bash
echo"helloworld"|tr'a-z''A-Z'输出:HELLOWORLD
3.实时监控
bash
tail-f/var/log/nginx/access.log|grep"404"
4.错误隔离
bash
保存正常输出,丢弃错误
makebuild2>/dev/null|teebuild.log
5.多步骤分析
bash
netstat-tuln|grep":80"|awk'{print$5}'|cut-d:-f1
---
六、最佳实践与注意事项
1.顺序敏感:
command2>&1>file和command>file2>&1作用不同(后者正确)。
2.管道错误处理:
默认管道只传递stdout,需显式合并错误流:
bash
command2>&1|less
3.避免覆盖重要文件:
使用>file前确认文件可覆盖,或用set-onoclobber禁止覆盖。
4.管道中断:
用tee同时查看和保存管道数据:
bash
dmesg|teeboot.log|grep"USB"
5.性能考量:
避免对大数据集使用多次管道,改用awk单次处理:
bash
低效:catbigfile|grep"x"|wc-l
高效:grep"x"bigfile|wc-l
>Linux哲学精髓:通过管道和重定向组合小工具(如grep,sort,awk),实现复杂任务。例如统计词频:
>bash
>catbook.txt|tr'''\n'|sort|uniq-c|sort-nr