• 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
    

    本文来自博客园,作者:GaoBeier,转载请注明原文链接:https://www.cnblogs.com/gao0722/p/15026546.html

  • 相关阅读:
    判断浏览器是pc端和移动
    高德谷歌地图切换成英文地图
    小程序修改默认的单选框复选框样式
    推荐系统| ① Movies概述
    推荐系统| ② 离线推荐&基于隐语义模型的协同过滤推荐
    数据结构与算法| 复杂度分析
    Flink| 运行架构
    机器学习| 高数-基础
    Flink| 概述| 配置安装
    推荐系统| 概述
  • 原文地址:https://www.cnblogs.com/gao0722/p/15026546.html
Copyright © 2020-2023  润新知