06.Linux IO重定向

08.Linux IO重定向

1. 重定向基础概述

1.1 什么是重定向

将原本要输出到屏幕中的数据信息,重新定向到某个指
定的文件中,或者定向到黑洞(/dev/null)中。

1.2 为什么需要重定向

1、当程序执行输出的信息比较多时,需要保存下来
在进行分页查看;
2、后台执行的程序一般都会有输出,不希望它的输
出干扰到屏幕;
3、定时执行的备份任务,希望将备份的结果保留下
来时;
4、当重复创建用户,会提示一些错误信息,可以直
接将信息丢弃;
5、希望将错误日志与正确日志,分别输出保存到不
同文件时;

1.3 标准输入与输出

  • 当进程操作一个文件时:

    • 1.首先进程是无法直接访问硬件,需要借助内核来
      访问文件;
    • 2.而内核 kernel 需要利用文件描述符 (file
      descriptor) 来访问文件。文件描述符百度百科
  • 总结:进程--通过-->文件描述符(非负整数)--访问-->文件名称;进程使用文件描述符来管理打开的文件
    对应关系;

  • 第一步:运行 tail -f /etc/passwd

  • 第二步:通过文件描述符3 --> /etc/passwd --> inode
    --> block

  • 第三步:正确输出---> 默认情况下通过文件描述 1 ---
    当前终端 1>(改变输出的位置,文件,黑洞)

  • 第四步:错误输出--> 默认情况下通过文件描述2 --->
    当前终端 2>

  • 通常程序访问一个文件至少会打开三个标准文件,分
    别是标准输入、标准输出、错误输出。

  • 进程将从标准输入中得到数据,将正常输出打印至屏
    幕终端,将错误的输出信息也打印至屏幕终端。

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

2. 输出重定向案例

  • 输出重定向.改变输出内容的位置.输出输出重定向有如
    下几种方式,如表格所示

    类型 操作符 用途
    标准覆盖输出重定向 1> 将程序输出的正确结果输出到指定的文件中去,会覆盖原文件的内容
    标准追加输出重定向 1>> 将程序输出的正确结果以追加的方式输出到指定文件.不会覆盖原有文件
    错误覆盖输出重定向 2> 将程序的错误结果输出到执行的文件中.会覆盖文件原有内容
    错误追加输出重定向 2>> 将程序输出的错误结果以追加的方式输出到指定文件.不会覆盖原有文件

2.1 案例1-标准输出重定向

  • 标准输出重定向示例
    • 1.如果文件不存在则创建
    • 2.如果文件存在则清空内容
[root@oldxu ~]# > edu.txt
[root@oldxu ~]# ifconfig eth0 > edu.txt

2.2 案例2-标准追加输出重定向

  • 标准追加输出重定向示例
    • 1.如果文件不存在则创建
    • 2.如果文件存在则在文件尾部添加内容
[root@oldxu ~]# echo "Hello Students" >> if

2.3 案例3-错误输出重定向

  • 标准错误输出重定向
    • 1.正确输出及错误输出至相同文件
    • 2.正确输出及错误输出至不同文件
[xuliangwei@oldxu ~]$ find /etc -name
"*.conf" 1>ok 2>ok
[xuliangwei@oldxu ~]$ find /etc -name
"*.conf" 1>ok 2>err

2.4 案例4-混合和输出重定向

  • 混合输出重定向
    • 1.将正确输出和错误输出混合至同一文件
    • 2.将两个文件内容组合为一个文件
[xuliangwei@oldxu ~]$ find /etc -name
"*.conf" &>ab
[xuliangwei@oldxu ~]$ cat a b > c
  • 正确和错误都输入到相同位置

[root@oldxu ~]# ls /root /error >ab 2>&1

2.5 案例5-将内容输出至黑洞

  • 将内容输出至黑洞设备/dev/null

    [root@oldxu ~]# ls /root /error >ab
    2>/dev/null
    [root@oldxu ~]# ls /root /error >ab
    &>/dev/null
    

3. 输入重定向案例

  • 输入重定向:指的是"重新指定设备"来"代替键盘"做为新的输入设备;

3.1 输入重定向示例

1.通过输入重定向读取文件内容;

[root@oldxu ~]# cat < /etc/hosts

2.通过输入重定向读入多行内容

[root@dns-master ~]# cat <<EOF
小明 99
小红 100
小王 80
EOF   # 只要不出现EOF则可以一直输入

3.通过输入重定向将数据导入至数据库中;

[root@oldxu ~]# mysql -uroot -poldxu.com </opt/wordpress.sql

3.2 脚本输入重定向

  • 使用输入重定向打印安装服务的菜单导航栏
[root@dns-master ~]# cat install.sh
#!/usr/bin/bash
cat <<-EOF
---------主菜单----------
|  1) 安装nginx     |
|  2) 安装php      |
|  3) 退出       |
--------------------------
EOF
read -p "请选择你要安装的软件编号 [ 1 | 2 | 3
]: "

3.3 输入重定向场景

  • 1.恢复数据时;
  • 2.脚本打印菜单时会用到
  • 3.cat写入文件时;vim
  • 输出重定向:
    • 正确输出:
      • 1> : 覆盖(先清空,后写入)
      • 1>> : 直接写入文件的尾部(末尾)
    • 错误输出 :
      • 2> : 覆盖(先清空,后写入)
      • 2>> : 直接写入文件尾部(末尾)
    • 混合输出
      • &> /dev/null
      • &>> /dev/null
      • 1>/dev/null 2>&1

4.进程管道技术

4.1 什么是管道

  • 管道操作符" | ",主要用来连接左右两个命令,将左侧的命令[标准输出],交给右侧命令的[标准输入]
  • 注意事项:无法传递标准错误输出至后者的命令
  • 管道命令符能让大家进一步掌握命令之间的搭配使用方法.进一步提高命令输出值的处理效率

4.2 管道流程示意图

  • 格式: cmd1 | cmd2 [... | cmdn ]

4.3 管道使用案例

4.3.1 案例1

  • 案例1.将/etc/passwd中的用户按UID大小排序
[root@oldxu ~]# sort -t":" -k3 -n
/etc/passwd
[root@oldxu ~]# sort -t":" -k3 -n
/etc/passwd -r
[root@oldxu ~]# sort -t":" -k3 -n
/etc/passwd |head

4.3.2 案例2

  • 案例2 : 统计当前/etc/passwd 中用户使用的shell 类型
# 思路:取出第七列(shell) | 排序(把相同归类)| 去重
[root@oldxu ~]# awk -F: '{print $7}'
/etc/passwd
[root@oldxu ~]# awk -F: '{print $7}'
/etc/passwd |sort
[root@oldxu ~]# awk -F: '{print $7}'
/etc/passwd |sort |uniq
[root@oldxu ~]# awk -F: '{print $7}'
/etc/passwd |sort |uniq -c

4.3.3 案例3

  • 案例3:打印并输出当前所有主机所有网卡的 IP 地址
[root@oldxu ~]# ip addr |grep 'inet ' |awk
'{print $2}' |awk -F"/" '{print $1}'
127.0.0.1
10.0.0.100

4.4 tee与xargs

4.4.1 管道中使用tee

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

4.4.2 管道中使用xargs

  • xargs 参数传递,主要让一些不支持管道的命令可以
    使用管道技术
# which cat | xargs ls -l
# ls | xargs rm -fv
posted @ 2021-07-18 14:39  GaoBeier  阅读(60)  评论(0编辑  收藏  举报