zoukankan      html  css  js  c++  java
  • 文件重定向输入输出

    重定向

    什么是重定向?

    将原本要输出在屏幕中的内容,重新定向输出到指定的文件或设备中。
    

    为什么要使用重定向?

    1.备份时,我们需要知道备份的结果
    
    2.屏幕上输出信息,比较重要的时候,我们想要保存下来
    
    3.定时任务,我们需要知道结果
    
    4.执行命令时,明知道会报错,我们会使用重定向,将结果 放入 /dev/null
    
    5.执行命令时,正确 结果和错误 结果会同时输出,将正确结果输出到常规日志,将错误结果输出到错误日志
    

    重定向的分类

    • 标准输入

    • 标准输出

    名称 文件描述符 作用
    标准输入(stdin) 0 通常键盘(其他输入命令的终端设备)
    标准输出(stdout) 1 默认输出到屏幕
    错误输出(stderr) 2 默认输出到屏幕
    文件名(filename) 3+
    [root@localhost ~]# ll /dev/std*
    lrwxrwxrwx 1 root root 15 3月  25 10:36 /dev/stderr -> /proc/self/fd/2
    lrwxrwxrwx 1 root root 15 3月  25 10:36 /dev/stdin -> /proc/self/fd/0
    lrwxrwxrwx 1 root root 15 3月  25 10:36 /dev/stdout -> /proc/self/fd/1
    
    [root@localhost ~]# ll /proc/121169/fd/
    总用量 0
    lrwx------ 1 root root 64 4月   7 11:28 0 -> /dev/pts/3
    lrwx------ 1 root root 64 4月   7 11:28 1 -> /dev/pts/3
    lrwx------ 1 root root 64 4月   7 11:27 2 -> /dev/pts/3
    lr-x------ 1 root root 64 4月   7 11:28 3 -> /var/log/messages
    

    输出重定向

    /dev/null

    /dev/pts/0

    /dev/pts/1

    /tmp/zls.txt

    /root/1.txt

    类型 符号 用途 备注
    标准覆盖输出重定向 1> 将命令执行的正确结果默认输出的位置,修改为指定的文件或者终端(覆盖原有内容) 通常'>'即可,1可以不写,默认就是1
    标准追加输出重定向 >> 将命令执行的正确结果,输出到指定文件的末尾(不覆盖原有内容)
    错误覆盖输出重定向 2> 将命令执行的错误结果默认输出的位置,修改为指定的文件或者终端(覆盖原有内容)
    错误追加输出重定向 2>> 将命令执行的错误结果,输出到指定文件的末尾(不覆盖原有内容)
    标准输入重定向 0< 将命令中接收输入内容由默认的键盘,改为命令或者文件 通常'<'即可0可以写也可以不写,默认0
    标准输入追加重定向 0<< 将命令中接收输入内容由默认的键盘,改为命令或者文件
    # 标准覆盖输出重定向
    [root@localhost ~]# echo zls>/tmp/1.txt
    
    [root@localhost ~]# cat /tmp/1.txt
    zls
    
    [root@localhost ~]# echo 321>/tmp/2.txt
    
    [root@localhost ~]# cat /tmp/2.txt
    
    [root@localhost ~]# echo zls1>/tmp/3.txt
    [root@localhost ~]# cat /tmp/3.txt
    zls1
    #查看默认输入输出对应信息,/dev/下的文件为链接文件
    [root@oldboy fd]# ll /dev/std*
    lrwxrwxrwx 1 root root 15 Apr  7 09:07 /dev/stderr -> /proc/self/fd/2
    lrwxrwxrwx 1 root root 15 Apr  7 09:07 /dev/stdin -> /proc/self/fd/0
    lrwxrwxrwx 1 root root 15 Apr  7 09:07 /dev/stdout -> /proc/self/fd/1
    
    

    # 标准追加输出重定向
    [root@localhost ~]# echo 456 >> /var/log/messages
    [root@localhost ~]# echo 123 >> /var/log/messages
    

    # 错误输出重定向
    [cdx@localhost ~]$ find /etc/ -type d
    

    # 将标准输出和错误输出都输出到相同的文件中
    [cdx@localhost ~]$ find /etc/ -type d > /tmp/100.txt 2>&1
    
    [cdx@localhost ~]$ find /etc/ -type d &> /tmp/101.txt
    

    #将错误输出,重定向到黑洞
    [root@localhost ~]# ls / /ooo 2>/dev/null
    

    # 脚本中使用重定向
    #!/bin/bash
    
    . /etc/init.d/functions
    
    read -p "请输入要检测的IP:" IP
    
    ping -c1 -W1 $IP &>/dev/null
    
    if [ $? -eq 0 ];then
            action "$IP" /bin/true >> /tmp/IP_OK.txt
    else
            action "$IP" /bin/false >> /tmp/IP_FAILD.txt
    fi
    

    输入重定向

    [root@localhost ~]# mail -s "$(date +%F-%T)_test" 133411023@qq.com < /etc/passwd
    

    文件描述符是啥

    0 1 2 3 ..等标准输入输出编号
    

    进程pid对应文件描述符查看

    查看步骤:
    [root@oldboy fd]# tail -f /var/log/messages		#持续跟踪日志文件
    [root@oldboy oldboy]# ps -ef |grep tail			#重开终端,查看tail对应pdi为7728
    root       7728   7322  0 17:11 pts/1    00:00:00 tail -f /var/log/messages
    root       7730   7179  0 17:12 pts/0    00:00:00 grep --color=auto tail
    [root@oldboy oldboy]# cd /proc/7728/fd			#进入proc的pid后台文件,查看默认文件描述符指向
    [root@oldboy fd]# ll							#同理,如有对重定向输出另存文件,那对应下方内容有变
    total 0
    lrwx------ 1 root root 64 Apr  7 17:13 0 -> /dev/pts/1
    lrwx------ 1 root root 64 Apr  7 17:13 1 -> /dev/pts/1
    lrwx------ 1 root root 64 Apr  7 17:12 2 -> /dev/pts/1
    lr-x------ 1 root root 64 Apr  7 17:13 3 -> /var/log/messages
    lr-x------ 1 root root 64 Apr  7 17:13 4 -> anon_inode:inotify
    

    文件描述符影响

    一般linux需要进行优化,有针对open files 也就是文件描述符数量优化,每个进程pid有几个文件描述符,当pid过多,产生的文件描述符数量如达到1024会导致无法产生pid,如ssh远程连接也会产生pid号,对应ssh可能也会受此影响,无法连接至服务器,所以需要对open files数量进行优化
    #查看文件描述符数量 
    [root@oldboy fd]# ulimit -a
    core file size          (blocks, -c) 0
    data seg size           (kbytes, -d) unlimited
    scheduling priority             (-e) 0
    file size               (blocks, -f) unlimited
    pending signals                 (-i) 3805
    max locked memory       (kbytes, -l) 64
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 1024				#1024为默认文件描述符数量
    pipe size            (512 bytes, -p) 8
    POSIX message queues     (bytes, -q) 819200
    real-time priority              (-r) 0
    stack size              (kbytes, -s) 8192
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 3805
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited
    
    

    标准输入案例

    案例一:

    # 发邮件
    [root@localhost ~]# echo '我是谁。'|mail -s 'biaoti' zls_mail
    
    [root@localhost ~]# mail -s  '/etc/passwd' zls_mail 0< /etc/passwd
    [root@localhost ~]# mail -s  '/etc/passwd' zls_mail < /etc/passwd
    
    [root@localhost ~]# mail zls_mail
    Subject: ceshi
    youjianneirong
    .
    EOT
    

    案例二:

    # 命令等待输入
    [root@localhost ~]# grep 'zls'
    xxxx
    zls123
    zls123
    

    案例三:

    [root@localhost ~]# dd if=/dev/zero of=/opt/zls_disk bs=1M count=1024
    
    [root@localhost ~]# dd </dev/zero >/opt/zls_disk2 bs=1M count=512
    

    案例四:

    # 数据库备份和恢复
    [root@localhost opt]# systemctl start mariadb
    
    [root@localhost opt]# mysqldump -uroot -p123 -B zls > /tmp/zls.txt
    
    [root@localhost opt]# mysql -uroot  -p123 < /tmp/zls.txt
    [root@localhost opt]# cat /tmp/zls.txt | mysql -uroot -p123
    

    案例五:

    [root@localhost opt]# echo -e "111
    222
    333" > file1.txt
    [root@localhost opt]# cat file1.txt
    111
    222
    333
    [root@localhost opt]# echo '
    1111
    2222
    3333
    4444
    ' > file2.txt
    
    [root@localhost opt]# cat >> 1.txt <<EOF
    > aaa
    > bbb
    > ccc
    > ddd
    > EOF
    
    [root@localhost opt]# cat >> 2.txt
    111
    222
    333
    444
    
    Ctrl + d 结束
    
    
    cat <<EOF
    +--------------------------+
    | vmware manager           |
    +--------------------------+
    | by zls                   |
    +--------------------------+
    | 1. Install KVM           |
    | 2. Install or Reset C6.5 |
    | 3. Install or Reset C7.4 |
    | 5. Instqll or Reset W7   |
    | 6. Remove all            |
    | q. quit                  |
    +--------------------------+
    EOF
    
    
    [root@localhost opt]# cat <<EOF
    > 1.install  mysql
    > 2.install nginx
    > 3.intsall php
    > 4.install tomcat
    > 5.install redis
    > EOF
    1.install  mysql
    2.install nginx
    3.intsall php
    4.install tomcat
    5.install redis
    

    案例六:

    # 两条命令同时重定向
    [root@localhost opt]# (ls ; date) > 1.txt
    
     (while :; do date; sleep 2; done) &>date.txt &
     
     #如果不希望某些命令的执行对当前 shell 环境产生影响,请在subshell中执行
     [root@localhost ~]# (cd /boot; ls)
    

    管道技术

    管道操作符号:|,叫做管道符

    作用:将管道符左边命令的标准输出,交给管道符右边命令的标准输入来处理

    注意:管道输入无法接收错误输出,只能接收标准输出

    用法:cmd1|cmd2|cmd3| cmd4...

    案例一:

    # 取出passwd文件中,uid最大的前五个
    [root@localhost ~]# sort -nr -k 3 -t ':' /etc/passwd|head -5
    

    案例二:

    # 统计出passwd文件中,所有用户的shell种类
    [root@localhost ~]# awk -F: '{print $7}' /etc/passwd|sort |uniq|wc -l
    6
    

    案例三:

    [root@localhost ~]# hostname -I
    10.0.0.200
    [root@localhost ~]# ifconfig |awk 'NR==2{print $2}'
    10.0.0.200
    sed
    awk
    grep
    
    组合:sed awk
    grep awk
    
    10种方法,取IP
    

    案例四:

    # 取出 磁盘已使用 百分比
    [root@localhost ~]# df -h|awk '{print $5}'|awk -F '%' '{print $1}'
    已用
    9
    0
    0
    1
    0
    24
    5
    0
    1
    

    tee

    用途:对文件既想要保存在文件当中,又想要输出结果给下个管道执行,类似于下图的三通,一个输入有两个输出效果

    # tee 和 重定向的区别
    [root@zls ~]# date > date.txt 
    [root@zls ~]# date |tee date.txt
    

    xargs

    // 将参数列表转换成小块分段传递给其他命令,读入stdin 的数据转换为参数添加至后面的命令,让一些不支持管道的命令可以使用管道,也就是将输出结果不以屏幕输出为准,会将输出信息当文件处理,是数据流的执行过程

    #通过xargs将输入内容输出至/tmp/后方
    [root@localhost opt]# find /etc/ -name '*.conf'|xargs cp -t /tmp/
    
    #xargs -i参数,配合{}使用,可将输出结果放至{}中执行
    [root@oldboy ~]# find /etc/ -type f -size +100k|xargs -i cp {} /tmp
    
    

    subshell

    // 也叫作子shell,是当前bash里的一个shell,不会退出当前终端,也不会在前台打开一个终端,而是将命令放入后台子shell中执行,然后将命令的结果输出到当前shell的屏幕输出

    #在前台终端不进入目录的情况,子shell进入目录,并且查看内容,输出当前界面,两个命令同时生效用括号括起来。
    [root@oldboy ~]# (cd /boot;ls)
    config-3.10.0-957.el7.x86_64							
    efi
    grub
    grub2
    initramfs-0-rescue-41116adcca6346a995b3ed67373c7598.img
    initramfs-3.10.0-957.el7.x86_64.img
    symvers-3.10.0-957.el7.x86_64.gz
    System.map-3.10.0-957.el7.x86_64
    vmlinuz-0-rescue-41116adcca6346a995b3ed67373c7598
    vmlinuz-3.10.0-957.el7.x86_64
    
  • 相关阅读:
    PS软件之,快速的修改图片你的尺寸
    想的太多,做的太少
    Java-Junit 的Hello world
    Java-hibernate的映射文件
    工作思路
    Spring入门Hello World
    PHP 进制问题
    Java-hibernate的Hello World
    PHP获得header头进行分析
    动软模板使用教程
  • 原文地址:https://www.cnblogs.com/tcy1/p/12654642.html
Copyright © 2011-2022 走看看