1.重定向概述

1.什么是重定向

将原本要输出到屏幕的数据信息,重新定向到某个指定的文件中。比如:每天凌晨定时备份数据,希望将备份数据的结果保存到某个文件中。

这样第二天通过查看文件的内容就知道昨天备份的数据是成功还是失败。

2.为何要使用重定向

1.当屏幕输出的信息很重要,而且希望保存重要的信息时;

2.后台执行中的程序,不希望他干扰屏幕正常的输出结果时;

3.系统的例行命令, 例如定时任务的执行结果,希望可以存下来时;

4.一些执行命令,我们已经知道他可能出现错误信息, 想将他直接丢弃时;

5.错误日志与正确日志需要分别输出至不同的文件保存时;

3.学习重定向的预备知识,标准输入与输出

当运行一个程序时通常会自动打开三个标准文件,分别是标准输入、标准输出、错误输出

     
名称 文件描述符 作用
标准输入(STDIN) 0 默认是键盘,也可以是文件或其他命令的输出。
标准输出(STDOUT) 1 默认输出到屏幕。
错误输出(STDERR) 2 默认输出到屏幕。
文件名称(filename) 3+  

输入和输出

  • 标准输入 默认是来自键盘的输入 stdin 0

  • 标准输出 默认输出到终端窗口 stdout 1

  • 标准错误输出 默认输出到终端窗口 stderr 2

2.I/O重定向

改变输出另外的地方,比如重定向输出到终端,改到输出到文件

  1. m[root@192 test]#file /run/gssproxy.sock > c
  2. m[root@192 test]#cat c
  3. /run/gssproxy.sock: socket

错误输出到文件f中

  1. m[root@192 test]#ls sdjfjei 2> f
  2. m[root@192 test]#cat f
  3. ls: cannot access sdjfjei: No such file or directory

> 覆盖

  • > 将标准输出重定向到文件中

  • 2> 将错误输出重定向到文件中

  • &> 将所有的输出都重定向到文件中

禁止、允许覆盖

  1. m[root@192 test]#>q
  2. m[root@192 test]#ls jdjfdk 2>q
  3. m[root@192 test]#set -C
  4. m[root@192 test]#>q
  5. -bash: q: cannot overwrite existing file
  • 禁止覆盖 set -C

  • 允许覆盖 set +C

>> 追加

  1. m[root@192 test]#ls djfjdkf 2>>a
  2. m[root@192 test]#ls djfjdkf 2>>a
  3. m[root@192 test]#ls djfjdkf 2>>a
  4. m[root@192 test]#cat a
  5. ls: cannot access djfjdkf: No such file or directory
  6. ls: cannot access djfjdkf: No such file or directory
  7. ls: cannot access djfjdkf: No such file or directory

>> 将标准输出追加到文件中

2>> 将错误输出追加到文件中

&>> 将所有输出追加到文件中

标准输入和错误输入分开保存

  1. [root@localhost ~]#ls f 45yuio > log.log 2> error.log
  2. [root@localhost ~]#cat log.log
  3. f
  4. [root@localhost ~]#cat error.log
  5. ls: cannot access 45yuio: No such file or directory

合并所有的输出

  • &> 覆盖重定向

  • &>> 追加重定向

  • command > file 2>&1

  • command >> file 2>&1

  1. # 把错误的也合并到标准输出到r文件
  2. m[root@192 test]#ls f 34jdj > r 2>&1
  3. m[root@192 test]#cat r
  4. ls: cannot access 34jdj: No such file or directory
  5. f
  • ():合并多个文件的输出

  1. m[root@192 test]#(ls djfj;ls djfjjjnf) 2>g
  2. m[root@192 test]#cat g
  3. ls: cannot access djfj: No such file or directory
  4. ls: cannot access djfjjjnf: No such file or directory
  • /dev/null 黑洞,不断地吞

超级回收站,不断地接受输出

  1. m[root@192 test]#(ls f;ls djfjdk) &> /dev/null
  • /dev/zero 不断地吐

  1. # 测试磁盘速度
  2. m[root@192 test]#dd if=/dev/zero of=j bs=100M count=2
  3. 2+0 records in
  4. 2+0 records out
  5. 209715200 bytes (210 MB) copied, 0.247444 s, 848 MB/s

3.从文件导入stdin

tr 字符替换

  1. -t 截断
  2. -d 删除
  3. -s 压缩,去重
  4. -c 取反
  5.  
  6. # 从文件中替换
  7. [root@localhost ~]#tr 'a-z' 'A-Z' < /etc/issue
  8. \S
  9. KERNEL \R ON AN \M
  10. [root@localhost ~]#tr 'a-z' 'A-Z'
  11. qwertyy
  12. QWERTYY
  13. 12345678
  14. 12345678
  15. ASDFGHJ
  16. ASDFGHJ
  17. qwertyuio
  18. QWERTYUIO
  19. ^C
  20. [root@localhost ~]#tr ab 12
  21. ab
  22. 12
  23. abb
  24. 122
  25. asdfghjkl
  26. 1sdfghjkl
  27. ^C
  28. [root@localhost ~]#tr abc 12
  29. ab
  30. 12
  31. abc
  32. 122
  33. abc
  34. 122
  35. ^C
  36. [root@localhost ~]#tr ab 123
  37. ab
  38. 12
  39. abb
  40. 122
  41. avc
  42. 1vc
  43. qbc
  44. q2c
  45. abc
  46. 12c
  47.  
  48. # 截断
  49. [root@localhost ~]#tr -t abc 12
  50. abc
  51. 12c
  52. ab
  53. 12
  54.  
  55. # 删除
  56. [root@localhost ~]#tr -d abc
  57. qwertyui
  58. qwertyui
  59. an^H^H
  60. n
  61.  
  62. abc
  63.  
  64. artyibrtyuiocrtyuiop
  65. rtyirtyuiortyuiop
  66. ^C
  67. [root@localhost ~]#tr -d abc < /etc/issue
  68. \S
  69. Kernel \r on n \m
  70.  
  71. [root@localhost ~]#cat /etc/issue
  72. \S
  73. Kernel \r on an \m
  74. [root@localhost ~]#tr -s a
  75. abc
  76. abc
  77. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabc
  78. abc
  79. ^C
  80. [root@localhost ~]#tr -sc a
  81. aasdaaaaaaa
  82. aasdaaaaaaa
  83. ^[[A^H^H^C
  84. [root@localhost ~]#tr -sc a
  85. aaaaaaaaabbbbbbbbbbbbbccccccccddddddddddd
  86. aaaaaaaaabcd
  87. [root@localhost ~]#tr -dc a
  88. aaaaaaaaaaaabbbbbbbbbb
  89. asdfghjkqwertyuiozxcvbnmxcvbnm,.
  90. aaaaaaaaaaaaa
  91. ctrl+d 结束
  92. [root@localhost ~]#tr -dc "a\n"
  93. asdfghjk
  94. a
  95. wertyujk;l'
  96.  
  97. asdfghj
  98. a
  99. [root@localhost test]#tr -d a < issue > issue
  100. # 处理完成以后不能写会到源文件,要写到新的文件中
  101.  
  102. [root@localhost test]#seq 1 10 > b
  103. [root@localhost test]#cat b
  104. 1
  105. 2
  106. 3
  107. 4
  108. 5
  109. 6
  110. 7
  111. 8
  112. 9
  113. 10
  114. [root@localhost test]#tr -d "\n" < b
  115. 12345678910[root@localhost test]#tr -d "\n" < b
  116. [root@localhost test]#tr "\n" " " <b
  117. 1 2 3 4 5 6 7 8 9 10 [root@localhost test]#tr "\n" " " <b >c
  118. [root@localhost test]#cat c
  119. 1 2 3 4 5 6 7 8 9 10 [root@localhost test]#tr " " "\n" <c
  120. 1
  121. 2
  122. 3
  123. 4
  124. 5
  125. 6
  126. 7
  127. 8
  128. 9
  129. 10

多行发送给stdin

  1. # 第一种方式
  2. [root@localhost test]#cat > f1
  3. qwert
  4. wertyui
  5. wertyui
  6. wertyuiopasdfghjk
  7. sdfghjkl
  8. sdfyhjkl;sdfghjkl;xcvb
  9.  
  10. # 第二种方式
  11. [root@localhost test]#cat > f2 <<EOF
  12. > qwerty
  13. > qwertyu
  14. > wertyui
  15. > qwertyu
  16. > EOF
  17. EOF 不是必须得,只要两个相同就可以

4.管道

管道使用“|”来表示,主要用来连接左右两个命令, 将左侧的命令的标准输出, 交给右侧命令的标准输入

PS: 无法传递标准错误输出至后者命令

命令1|命令2|命令3

  • 把命令1的输出结果当做命令2的输入结果,把命令2的输出结果当成命令3的输入结果

  • 默认情况下,管道只能传送标准输出

  • 如果需要把错误输出也传递,则需要|&

  • 一般用来组合多个命令

  • 有一些命令是不接受管道的

  1. [root@localhost test]#ls f1|tr 'a-z' 'A-Z'
  2. F1
  3. [root@localhost test]#ls f
  4. ls: cannot access f: No such file or directory
  5. [root@localhost test]#ls f|tr 'a-z' 'A-Z'
  6. ls: cannot access f: No such file or directory
  7. [root@localhost test]#ls f|&tr 'a-z' 'A-Z'
  8. LS: CANNOT ACCESS F: NO SUCH FILE OR DIRECTORY
  9. # 不接受管道
  10. [root@localhost test]#echo file{1..20}|touch
  11. touch: missing file operand
  12. Try 'touch --help' for more information.

案例1: 将/etc/passwd 中的用户按 UID 大小排序

  1. [root@lqz ~]# sort -t":" -k3 -n /etc/passwd
  2. [root@lqz ~]# sort -t":" -k3 -n /etc/passwd -r
  3. [root@lqz ~]# sort -t":" -k3 -n /etc/passwd |head

案例2: 统计当前/etc/passwd 中用户使用的 shell 类型

  1. #思路:取出第七列(shell) | 排序(把相同归类)| 去重
  2. [root@lqz ~]# awk -F: '{print $7}' /etc/passwd
  3. [root@lqz ~]# awk -F: '{print $7}' /etc/passwd |sort
  4. [root@lqz ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq
  5. [root@lqz ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq -c

案例4: 统计网站的访问情况 top 20

  1. #思路: 打印所有访问的连接 | 过滤访问网站的连接 | 打印用户的 IP | 排序 | 去重
  2.  
  3. [root@lqz ~]# yum -y install httpd
  4. [root@lqz ~]# systemctl start httpd
  5. [root@lqz ~]# systemctl stop firewalld
  6.  
  7. [root@lqz ~]# ss -an |grep :80 |awk -F":" '{print $8}' |sort |uniq -c
  8. [root@lqz ~]# ss -an |grep :80 |awk -F":" '{print $8}' |sort |uniq -c |sort -k1 -rn |head -n 20

案例5: 打印当前所有 IP

  1. [root@lqz ~]# ip addr |grep 'inet ' |awk '{print $2}' |awk -F"/" '{print $1}'
  2. 127.0.0.1
  3. 192.168.69.112

案例6: 打印根分区已用空间的百分比(仅打印数字)

  1. [root@lqz ~]# df |grep '/$' |awk '{print $5}' |awk -F"%" '{print $1}'

PS: 管道命令符能让大家能进一步掌握命令之间的搭配使用方法,进一步提高命令输出值的处理效率。

1.管道中的tee技术

  1. #选项: -a追加
  2. [root@lqz ~]# ip addr |grep 'inet ' |tee ip.txt |awk -F"/" '{print $1}' |awk '{print $2}'
  3. 127.0.0.1
  4. 10.0.0.100
  5.  
  6. [root@lqz ~]# cat ip.txt
  7. inet 127.0.0.1/8 scope host lo
  8. inet 10.0.0.100/24 brd 192.168.69.255 scope global ens32

重定向与 tee 有他们在使用过程中有什么区别

  1. [root@lqz ~]# date > date.txt #直接将内容写入date.txt文件中
  2. [root@lqz ~]# date |tee date.txt #命令执行会输出至屏幕,但会同时保存一份至date.txt文件中

2.xargs参数传递,主要让一些不支持管道的命令可以使用管道技术

  1. # which cat|xargs ls- l
  2. # ls |xargs rm -fv
  3. # ls |xargs cp -rvt /tmp/ -或-> ls | xargs -I {} cp -rv {} /tmp/
  4. # ls |xargs mv -t /tmp/ -或-> ls | xargs -I {} mv {} /tmp

Linux输入输出的更多相关文章

  1. 全面理解Linux输入输出重定向

    全面理解Linux输入输出重定向 本教程通过视频方式讲解shell操作,理解感念,教程通俗易懂,比起看一大堆文档要舒服的多.本次教程主要讲解  Linux Shell 中支持输入输出重定向,用符号&l ...

  2. Linux输入输出重定向和文件查找值grep命令

    Linux输入输出重定向和文件查找值grep命令 一.文件描述符Linux 的shell命令,可以通过文件描述符来引用一些文件,通常使用到的文件描述符为0,1,2.Linux系统实际上有12个文件描述 ...

  3. [转帖]Linux教程(12)- linux输入输出重定向

    Linux教程(12)- linux输入输出重定向 2018-08-21 22:57:02 钱婷婷 阅读数 49更多 分类专栏: Linux教程与操作 Linux教程与使用   版权声明:本文为博主原 ...

  4. Linux 输入输出重定向, &>file, 2>&1, 1>&2

    Linux 输入输出重定向, &>file, 2>&1, 1>&2 一.1和2在Linux中代表什么 1.1 输出重定向 1.2 输入重定向 1.3 绑定重定 ...

  5. linux输入输出重定向

    http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html 在Linux下,当一个用户进程被创建的时候,系统会自动为该进程创建三个数据 ...

  6. Linux 输入输出(I/O)重定向

    目录 1.概念 Linux 文件描述符 2.输出重定向 格式 示例 注意 3.输入重定向 格式 示例 4.自定义输入输出设备 解释 示例 最后说两句 1.概念 在解释什么是重定向之前,先来说说什么是文 ...

  7. [100]linux输入输出重定向

    一目了然版本: &号含义: 参考 参考:非常经典,值得一看,我是在linux爱好者公众号里发现的. 下面是我自己的一些总结. linux的命令数据流 在Linux下,当一个用户进程被创建的时候 ...

  8. linux输入输出、重定向、管道

    本篇讲述linux系统的输入输出.管道和重定向. 1. liunx的输入输出 一个linux系统要想发挥作用,就要有输入输出,这样才可以与外界交互. 类型 设备文件名 文件描述符 设备名称 说明 备注 ...

  9. LINUX输入输出与文件——续

    1 目录操作 改变目录或文件的访问权限 #include <sys/stat.h> int chmod(const char *path, mode_t mode); //mode形如07 ...

  10. LINUX输入输出与文件

    1 文件描述符 内核为每个进程维护一个已打开文件的记录表(实现为结构体数组),文件描述符是一个较小的正整数(0-1023)(结构体数组下标),它代表记录表的一项,通过文件描述符和一组基于文件描述符的文 ...

随机推荐

  1. Python-单引号、双引号和三引号的作用和区别

    (一).作用 1. 单引号:单引号内部为一串字符(str). 2. 双引号:双引号内部为一串字符,双引号内的字符串可以出现单引号(相当于双引号优先级更高),但不能嵌套双引号. 3. 三引号:用于换行输 ...

  2. layui弹出层:使用icon图标小结

    转自:https://www.cnblogs.com/webSnow/p/15470350.html layui弹出层:使用icon图标小结 Layui 踩坑篇layui的弹框插件layer中,有很多 ...

  3. 2023年多校联训NOIP层测试5

    2023年多校联训NOIP层测试5 T1 糖果 \(10pts\) 首先考虑一些异或的性质: 归零率:\(a \bigoplus a=0\) 恒等律:\(a \bigoplus 0=a\) 交换律:\ ...

  4. 学习go语言编程之并发编程

    并发基础 并发包含如下几种主流的实现模型: 多进程 多线程 基于回到的非阻塞/异步IO 协程 协程 与传统的系统级线程和进程相比,协程最大的优势在于"轻量级",可以轻松创建上百万个 ...

  5. 【Azure 环境】微软云上主机,服务的安全更新疑问

    [问题一]微软云上的虚拟机,不论是Windows系统or Linux 系统,系统的安全补丁是由微软云平台   打上补丁进行修复,还是使用虚拟机的用户手动更新修复呢? [答]这些补丁不会由平台来直接操作 ...

  6. 【Azure 应用服务】App Service for Windows 环境中为Tomcat自定义4xx/5xx页面

    问题描述 通过设置Java Web项目,实现在App Service For Windows环境中达到自定义4XX/5XX的页面效果 问题解答 第一步:在本地项目文件中打开web.xml文件 (src ...

  7. 【Azure API 管理】 为APIM创建一个审批订阅申请的RBAC角色,最少的Action内容是什么呢?

    问题描述 在使用APIM服务中,需要为专门的一组用户赋予特殊的权限:审批APIM用户的对产品的订阅.需要自定义一个RBAC角色,那么如何来设置最少的Action满足需求呢? 问题解答 要对APIM订阅 ...

  8. ArrayList学习总结

    1.ArrayList简介[1] ArrayList实现了List接口.ArrayList的方法实现和vector相似,只是线程不安全的. ArrayList的 size.isEmpty.get.se ...

  9. Netty笔记(4) - 对Http和WebSocket的支持、心跳检测机制

    对HTTP的支持 服务端代码: 向 PipeLine中 注册 HttpServerCodec Http协议的编码解码一体的Handler 处理Http请求 封装Http响应 public class ...

  10. Java 开发人员调度软件项目 (java基础编程总结项目)+javaBean+测试代码+数组知识+数据结构+继承+多态+封装+自定义异常,异常处理+构造器知识+重载+重写+接口+实现接口+关键字使用(static +equalsIgnoreCase+fianl+instanceof判断类型)+向下转型与向上转型

    /** * * @Description Java 开发人员调度软件项目 (java基础编程总结项目) * +javaBean+测试代码+数组知识+数据结构+继承+多态+封装+自定义异常,异常处理 * ...