输入输出重定向 '<' '>'

本文详细介绍了Linux系统中输入输出重定向的基本概念及其使用方法,包括标准输入输出、错误输出、文件描述符重定向等核心知识点,并通过实例演示了如何高效利用重定向进行文件操作。

在我们理解输入输出重定向的时候要知道我们共有三个:

0: Standard Input (STDIN)

1: Standard Output (STDOUT)

2: Standard Error Output (STDERR)

 

需要注意并记住的知识点是:

(1)

   << 又是啥呢?这是所谓的 HERE Document ,它可以让我们输入一段文本,直到读到 << 后指定的字符串。比方说:

$ cat <<FINISH

     first line here

     second line there

     third line nowhere

     FINISH

这样的话,cat 会读进 3 行句子,而无需从 keyboard 读进数据且要等 ^d 结束输入。

(2)

* 2>&1 就是将 stderr 并进 stdout 作输出

* 1>&2 或 >&2 就是将 stdout 并进 stderr 作输出

(提示:将 &>换成 >& 也行啦~~! )

(3)

linux 档案系统里,有个设备档位于 /dev/null 。

(4)

$ echo "some text here" > file

$ cat < file

some text here

$ cat < file > file.bak

$ cat < file.bak

some text here

$ cat < file > file

$ cat < file

前面提到:$ cat < file >; file 之后原本有内容的档案结果却被洗掉了﹗要理解这一现像其实不难,这只是 priority 的问题而已:

* 在 IO Redirection 中,stdout 与 stderr 的管道会先准备好,才会从 stdin 读进资料。

也就是说,在上例中,>; file 会先将 file 清空,然后才读进 < file ,但这时候档案已经被清空了,因此就变成读不进任何数据了...

哦~~~ 原来如此~~~~ ^_^ 那... 如下两例又如何呢?

$ cat <> file 

$ cat < file >> file

我的理解是<>行为如下
1.不会把文件清空(不同于>)
2.会从第一个字节来写,而不是append.(不同于>>)

1<>file,表示把file打开,并指向fd1, fd1即标准输出,也就是所有影响标准输出的操作都会体现到file中

(4)

pipe line管道

在 cm1 | cm2 | cm3 ... 这段 pipe line 中,若要将 cm2 的结果存到某一档案呢?

若你写成 cm1 | cm2 >; file | cm3 的话,

那你肯定会发现 cm3 的 stdin 是空的﹗(当然啦,你都将水管接到别的水池了﹗)

聪明的你或许会如此解决:

cm1 | cm2 > file ; cm3 < file

是的,你的确可以这样做,但最大的坏处是:这样一来,file I/O 会变双倍﹗

在 command 执行的整个过程中,file I/O 是最常见的最大效能杀手。凡是有经验的 shell 操作者,都会尽量避免或降低 file I/O 的频率。

那,上面问题还有更好方法吗?

有的,那就是 tee 命令了。

* 所谓 tee 命令是在不影响原本 I/O 的情况下,将 stdout 复制一份到档案去。

因此,上面的命令行可以如此打:

cm1 | cm2 | tee file | cm3

在预设上,tee 会改写目标档案,若你要改为增加内容的话,那可用 -a 参数达成。

 附表:

  1. 常用文件重定向命令
  2. command > filename 把把标准输出重定向到一个新文件中
  3. command >> filename 把把标准输出重定向到一个文件中(追加)
  4. command 1 > fielname 把把标准输出重定向到一个文件中
  5. command > filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中
  6. command 2 > filename 把把标准错误重定向到一个文件中
  7. command 2 >> filename 把把标准错误重定向到一个文件中(追加)
  8. command >> filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中(追加)
  9. command < filename >filename2 把commond命令以filename文件作为标准输入,以filename 2文件
  10. 作为标准输出
  11. command < filename 把commond命令以filename文件作为标准输入
  12. command << delimiter 把从标准输入中读入,直至遇到delimiter分界符
  13. command <&m 把把文件描述符m作为标准输入
  14. command >&m 把把标准输出重定向到文件描述符m中
  15. command <&- 把关闭标准输入
复制代码



<think>好的,我现在需要帮助用户解决在CentOS7中如何通过管道实现输入输出重定向的转换的问题。首先,用户的问题是关于使用管道交换输入输出重定向符号的方法,这可能涉及到如何将命令的输出通过管道传递给另一个命令,或者如何将输出重定向到文件的同时使用管道。 根据提供的引用内容,特别是引用[2]提到管道符“|”的作用是过滤、特殊处理和扩展处理,通常与grep等指令配合使用。例如,ls / | grep y 用于过滤根目录下包含“y”的文档。这说明管道的基本用法是将前一个命令的标准输出作为后一个命令的标准输入。 接下来,用户可能想知道如何将输出重定向(如>或>>)与管道结合使用。比如,如何将一个命令的输出通过管道传递给另一个命令,同时将结果保存到文件。例如,使用tee命令可以将输出同时显示在屏幕和保存到文件:ls | tee file.txt | grep pattern。这里,tee命令处理管道中的数据,将输出分流。 另外,引用[3]提到了别名和环境变量的设置,虽然这可能与当前问题关系不大,但需要注意用户是否有其他潜在需求,比如避免误操作(如rm别名)。但当前问题主要集中在管道和重定向符号的使用上。 用户的问题中提到“交换输入输出重定向符号”,可能需要明确具体场景。例如,通常输入重定向使用<,输出使用>或>>。如果想通过管道来替代这些符号,可能需要组合命令。例如,cat < input.txt | command 等效于 command < input.txt,但使用管道可能更灵活,比如处理多个步骤。 还需要考虑错误输出的重定向,使用2>&1将标准错误和标准输出一起通过管道传递。例如,command 2>&1 | grep error 可以将错误信息也传递给grep处理。 总结可能的解决方案步骤: 1. 使用管道将多个命令连接,传递标准输出。 2. 结合tee命令在管道中分流输出到文件。 3. 使用输入重定向<和管道结合处理文件输入。 4. 处理标准错误输出时,使用2>&1合并到标准输出再通过管道传递。 需要验证这些方法是否符合CentOS7的环境,并确保示例的正确性。同时检查引用内容中的相关命令,如grep、hostname等,确保示例的准确性。例如,引用[2]中的grep用法可以作为示例的一部分。 最后,生成相关问题需要考虑用户可能进一步的问题,比如管道和重定向的区别、如何同时处理多个输出流、或者如何避免管道中的常见错误等。</think>在CentOS7中,管道(`|`)与输入输出重定向(`< > >>`)的结合使用可通过以下方式实现数据流转: ### 一、基础管道与重定向结合 1. **标准输出转文件+管道过滤** 将命令输出保存到文件的同时进行内容过滤: ```bash ls /usr/bin | tee all_programs.txt | grep python ``` - `tee all_programs.txt`:将`ls`结果同时写入文件并传递到后续管道 - `grep python`:筛选包含"python"的条目[^2] 2. **错误输出重定向到管道** 合并标准输出和错误输出后传递: ```bash find /etc -name "*.conf" 2>&1 | less ``` - `2>&1`:将标准错误输出合并到标准输出流 - `| less`:通过管道分页查看结果 ### 二、进阶输入输出交换 3. **输入重定向与管道嵌套** 将文件内容通过管道处理后输出: ```bash < server.log grep "ERROR" | mail -s "系统错误报告" admin@example.com ``` - `< server.log`:等效`cat server.log |`的输入方式 - 管道结果直接通过邮件发送[^5] 4. **多级管道处理** 组合多个命令实现复杂处理: ```bash dmesg | grep -i usb | awk '{print $5}' > usb_devices.log ``` - 第一级管道筛选USB相关日志 - 第二级管道提取设备名称字段 - 最终结果重定向到文件 ### 三、特殊场景处理 5. **双向过滤保存** 同时保存原始数据和过滤结果: ```bash netstat -tulpn | tee raw_connections.log | grep LISTEN > active_ports.log ``` 6. **避免管道中断** 使用`xargs`处理可能中断的管道: ```bash find /var/log -name "*.log" | xargs grep "404" ``` : 管道配合grep实现过滤操作 : 邮件发送命令的应用场景
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值