• 第二十三章 输入输出


    一、重定向概述


    将原本要输出到屏幕上面的内容,重定向到一个指定的文件中

    将原本从键盘上面输入的内容,改为从命令或者文件当中读取


    为什么要用重定向

    1. 数据非常重要,需要保存

    2. 后台程序的输出重定向到一个文件中

    3. 定时任务的执行结果

    4. 把一些错误的输出定向到空

    5. 把正确和错误的信息都需要保存

     

    stdin #标准输入 0 #从键盘上面读取输入的内容,或者从命令及文件中读取输入的内容

    stdout #标准输出 1 #默认将正确的信息标准输出到屏幕上方

    stderr #错误输出 2 #默认将错误的信息标准输出到屏幕上方


    [root@jindada ~]# ll /dev/std*
    lrwxrwxrwx 1 root root 15 Jul 20 19:44 /dev/stderr -> /proc/self/fd/2
    lrwxrwxrwx 1 root root 15 Jul 20 19:44 /dev/stdin -> /proc/self/fd/0
    lrwxrwxrwx 1 root root 15 Jul 20 19:44 /dev/stdout -> /proc/self/fd/1

     

    [root@jindada ~]# cat
    hello #标准输入
    hello #标准输出

     

    [root@jindada ~]# tail -f passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

    [1]+ Stopped tail -f passwd
    [root@jindada ~]# ps
    PID TTY TIME CMD
    10861 pts/0 00:00:00 bash
    10879 pts/0 00:00:00 bash
    10958 pts/0 00:00:00 su
    10980 pts/0 00:00:00 su
    10981 pts/0 00:00:00 bash
    10998 pts/0 00:00:00 su
    11020 pts/0 00:00:00 su
    11021 pts/0 00:00:00 bash
    11039 pts/0 00:00:00 su
    11040 pts/0 00:00:00 bash
    14928 pts/0 00:00:00 tail
    14930 pts/0 00:00:00 ps
    [root@jindada ~]# ll /proc/14928/fd
    total 0
    lrwx------ 1 root root 64 Jul 24 10:51 0 -> /dev/pts/0
    lrwx------ 1 root root 64 Jul 24 10:51 1 -> /dev/pts/0
    lrwx------ 1 root root 64 Jul 24 10:51 2 -> /dev/pts/0
    lr-x------ 1 root root 64 Jul 24 10:51 3 -> /root/passwd
    lr-x------ 1 root root 64 Jul 24 10:51 4 -> anon_inode:inotify


    [root@jindada ~]# jobs
    [1]+ Stopped tail -f passwd
    [root@jindada ~]# fg %1
    tail -f passwd


    [root@jindada ~]# jobs
    [root@jindada ~]# ll /proc/14928/fd
    ls: cannot access /proc/14928/fd: No such file or directory
    [root@jindada ~]# ps
    PID TTY TIME CMD
    10861 pts/0 00:00:00 bash
    10879 pts/0 00:00:00 bash
    10958 pts/0 00:00:00 su
    10980 pts/0 00:00:00 su
    10981 pts/0 00:00:00 bash
    10998 pts/0 00:00:00 su
    11020 pts/0 00:00:00 su
    11021 pts/0 00:00:00 bash
    11039 pts/0 00:00:00 su
    11040 pts/0 00:00:00 bash
    14933 pts/0 00:00:00 ps

     

    二、输出重定向


    将原本要输出到屏幕上面的内容,重定向到一个指定的文件中

    符号


    > #标准覆盖正确输出重定向 #将正确的内容覆盖源文件的 当文件不存在时,会自动创建

    >> #标准追加正确输出重定向 #将正确的内容追加到指定文件的底部 当文件不存在时,会自动创建

    2> #标准覆盖错误输出重定向 #将错误的信息覆盖到指定的文件中

    2>> #标准追加错误输出重定向 #将错误的信息追加到文件的底部


    案例:

    [root@jindada ~]# echo "hello" > 123.txt


    [root@jindada ~]# ip a s eth0 > ip.txt
    [root@jindada ~]# cat ip.txt
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:eb:ea:8d brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.100/24 brd 10.0.0.255 scope global noprefixroute eth0
    valid_lft forever preferred_lft forever
    inet6 fe80::3310:9d15:9ee4:43e8/64 scope link noprefixroute
    valid_lft forever preferred_lft forever

    #合并文件
    [root@jindada ~]# cat /etc/hosts /etc/resolv.conf > new.txt
    [root@jindada ~]# cat new.txt
    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
    # Generated by NetworkManager
    nameserver 223.5.5.5

    [root@jindada ~]# cat 123.txt
    hello
    [root@jindada ~]# echo "test" >> 123.txt
    [root@jindada ~]# cat 123.txt
    hello
    test

     

    [root@jindada ~]# ls /roott
    ls: cannot access /roott: No such file or directory
    [root@jindada ~]# ls /roott 2>err.txt
    [root@jindada ~]# cat err.txt
    ls: cannot access /roott: No such file or directory

     

    [root@jindada ~]# ls /roott 2>>err.txt
    [root@jindada ~]# ls /roott 2>>err.txt
    [root@jindada ~]# ls /roott 2>>err.txt
    [root@jindada ~]# cat err.txt
    ls: cannot access /roott: No such file or directory
    ls: cannot access /roott: No such file or directory
    ls: cannot access /roott: No such file or directory
    ls: cannot access /roott: No such file or directory

     

    #把正确的和错误的信息都保存到一个文件中


    [root@jindada ~]# ls /roott > file.txt 2>&1 #不推荐
    [root@jindada ~]# cat file.txt
    ls: cannot access /roott: No such file or directory
    [root@jindada ~]# mkdir /roott
    [root@jindada ~]# ls /roott > file.txt 2>&1
    [root@jindada ~]# cat file.txt


    [root@jindada ~]# ls /roott &>file.txt
    [root@jindada ~]# ls /roottt &>file.txt
    [root@jindada ~]# cat file.txt
    ls: cannot access /roottt: No such file or directory

    #将正确的信息和错误的信息重定向到空

    [root@jindada ~]# ls /roottt &> /dev/null


    #把正确的和错误的放在不同的文件中

    [root@jindada ~]# ls /rooot >> file1.txt 2>> file2.txt
    [root@jindada ~]# ll
    total 4
    -rw-r--r-- 1 root root 0 Jul 24 11:14 file1.txt
    -rw-r--r-- 1 root root 52 Jul 24 11:14 file2.txt
    [root@jindada ~]# cat file1.txt
    [root@jindada ~]# cat file2.txt
    ls: cannot access /rooot: No such file or directory
    [root@jindada ~]# ls /root >> file1.txt 2>> file2.txt
    [root@jindada ~]# ll
    total 8
    -rw-r--r-- 1 root root 20 Jul 24 11:15 file1.txt
    -rw-r--r-- 1 root root 52 Jul 24 11:14 file2.txt
    [root@jindada ~]# cat file1.txt
    file1.txt
    file2.txt
    [root@jindada ~]# cat file2.txt
    ls: cannot access /rooot: No such file or directory

     

    三、输入重定向


    将原本从键盘上面输入的内容,改为从命令或者文件当中读取

    符号

    < #标准输入重定向 #将原本从默认的键盘中读取数据改为由命令或者文件中读取


    << #标识符限定输入重定向 #从键盘中读取内容,直到遇到标识符的分解符为止

     

    案例:

    [root@jindada ~]# grep 'root' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    [root@jindada ~]# grep 'root' < /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    [root@jindada ~]# grep root
    oldboy
    root
    root
    rottttroot
    rottttroot

     

    [root@jindada ~]# dd if=/dev/zero of=/root/test.log bs=1M count=50
    50+0 records in
    50+0 records out
    52428800 bytes (52 MB) copied, 0.0362247 s, 1.4 GB/s
    [root@jindada ~]# ll
    total 51208
    -rw-r--r-- 1 root root 20 Jul 24 11:15 file1.txt
    -rw-r--r-- 1 root root 52 Jul 24 11:14 file2.txt
    -rw-r--r-- 1 root root 52428800 Jul 24 11:45 test.log
    [root@jindada ~]# ll -h
    total 51M
    -rw-r--r-- 1 root root 20 Jul 24 11:15 file1.txt
    -rw-r--r-- 1 root root 52 Jul 24 11:14 file2.txt
    -rw-r--r-- 1 root root 50M Jul 24 11:45 test.log


    [root@jindada ~]# dd </dev/zero >/root/oldboy.log bs=10M count=100
    100+0 records in
    100+0 records out
    1048576000 bytes (1.0 GB) copied, 21.3836 s, 49.0 MB/s
    [root@jindada ~]# ll -h
    total 1.1G
    -rw-r--r-- 1 root root 20 Jul 24 11:15 file1.txt
    -rw-r--r-- 1 root root 52 Jul 24 11:14 file2.txt
    -rw-r--r-- 1 root root 1000M Jul 24 11:48 oldboy.log
    -rw-r--r-- 1 root root 50M Jul 24 11:45 test.log

    [root@jindada ~]# cat file1.txt
    file1.txt
    file2.txt
    [root@jindada ~]# tr 't' 'T' < file1.txt
    file1.TxT
    file2.TxT

     


    数据库导入表

    [root@jindada ~]# mysql -uroot -p123 < all.sql


    [root@jindada ~]# cat >>file3.txt
    123
    345
    678
    456
    EOF
    123

    [root@jindada ~]# cat file3.txt
    123
    345
    678
    456
    EOF
    123
    [root@jindada ~]# cat >>file4.txt<<EOF
    > 123
    > dfer
    > rghrt
    > gergrtg
    > EOF
    [root@jindada ~]# cat file4.txt
    123
    dfer
    rghrt
    gergrtg

     

    [root@jindada ~]# cat 123.sh
    cat<<EOF
    1. rge
    2. fgo
    3. jfrio
    4. hfoih
    EOF
    [root@jindada ~]# sh 123.sh
    1. rge
    2. fgo
    3. jfrio
    4. hfoih

    四、管道技术


    | 管道

    连接左右两个命令的使用 把前面的命令作为标准输出通过管道交给后面的命令 作为标准输入


    只能把正确的信息交给后面的命令,错误的信息的不会传递


    [root@jindada ~]# head passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    [root@jindada ~]# head passwd | cat -n
    1 root:x:0:0:root:/root:/bin/bash
    2 bin:x:1:1:bin:/bin:/sbin/nologin
    3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
    4 adm:x:3:4:adm:/var/adm:/sbin/nologin
    5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    6 sync:x:5:0:sync:/sbin:/bin/sync
    7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    8 halt:x:7:0:halt:/sbin:/sbin/halt
    9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10 operator:x:11:0:operator:/root:/sbin/nologin


    [root@jindada ~]# ifconfig eth0
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
    inet 10.0.0.100 netmask 255.255.255.0 broadcast 10.0.0.255
    inet6 fe80::3310:9d15:9ee4:43e8 prefixlen 64 scopeid 0x20<link>
    ether 00:0c:29:eb:ea:8d txqueuelen 1000 (Ethernet)
    RX packets 99054 bytes 61039138 (58.2 MiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 55989 bytes 5452694 (5.2 MiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

    [root@jindada ~]# ifconfig eth0 | awk 'NR==2'
    inet 10.0.0.100 netmask 255.255.255.0 broadcast 10.0.0.255
    [root@jindada ~]# ifconfig eth0 | awk 'NR==2' | awk '{print $2}'
    10.0.0.100


    [root@jindada ~]# awk -F: '{print $3}' passwd | sort -rn | head
    1046
    1045
    1044
    1043
    1042
    1041
    1040
    1039
    1038
    1037


    #管道技术中的tee技术

    需要保存一些标准输出的内容

    [root@jindada ~]# echo $RANDOM | md5sum | cut -c 1-8 | tee pass.txt |passwd --stdin jindada01
    Changing password for user jindada01.
    passwd: all authentication tokens updated successfully.
    [root@jindada ~]# cat pass.txt
    100ada15


    -a #追加


    tee 和 重定向的区别

     

    重定向 #把要输出到屏幕上面的内容重定向到指定的文件中


    tee #把要输出到屏幕上面的内容重定向到指定的文件中 ,并且可以继续输出一份到屏幕上面

     

    #管道中xargs技术


    让一些不支持管道的命令支持管道 把前面命令的执行结果以文件的参数传递方式传递给后面的命令


    [root@jindada ~]# ls | xargs sed -i 's#root#oldboy#g'


    [root@jindada ~]# find /var/log/ -type f -name "*.log" |xargs cp -t /opt


    [root@jindada ~]# find /var/log/ -type f -name "*.log" |xargs -I {} cp {} /mnt/

     

  • 相关阅读:
    字的传送
    mov 寄存器,段寄存器
    c语言中利用三维数组计算成绩总分数
    python中break语句
    c语言中求课程总分、平均分。学生总分及平均分
    python中assert语句
    python中random模块引入随机数
    python中实现列表的倒序排列
    c语言中求两个矩阵的乘积
    python的严格缩进可以避免else悬挂
  • 原文地址:https://www.cnblogs.com/jhno1/p/13387327.html
Copyright © 2020-2023  润新知