美文网首页
IO重定向及管道

IO重定向及管道

作者: Hye_Lau | 来源:发表于2018-05-27 20:45 被阅读0次

    1.IO重定向

    (1)可用于输入的设备:文件(键盘设备、磁盘、网卡等)
    (2)可用于输出的设备:文件(显示器、磁盘、网卡等)
    (3)程序的数据流有三种:

    • 输入的数据流:<==标准输入(stdinput),键盘;
    • 输出的数据流:==>标准输出(stdout),显示器;
    • 错误输出流:==>错误输出(stderr),显示器;

    (4)fd:file descriptor,文件描述符

    • 标准输入:代码为0,使用< 或<<
    • 标准输出:代码为1,使用>或>>
    • 错误输出:代码为2,使用2>或2>>

    实例

    [root@localhost ~]# ll /
    总用量 106
    dr-xr-xr-x.   2 root root  4096 8月  15 2017 bin
    .......
    drwxr-xr-x.  20 root root  4096 7月   2 2017 var
    
    //将ll命令执行后的信息输出到~/rootfile文件
    [root@localhost ~]# ll / > ~/rootfile
    [root@localhost ~]# ll ~/rootfile
    -rw-r--r--. 1 root root 1251 5月  28 03:19 /root/rootfile
    

    (5)输出重定向

    • 1>:以覆盖的方法将正确的数据输出到指定的文件或设备上
    • 1>>:以累加的方法将正确的数据输出到指定的文件或设备上;
    • 2>:以覆盖的方法将错误的数据输出到指定的文件或设备上;
    • 2>>:以累加的方法将错误的数据输出到指定的文件或设备上;

    实例

    [root@localhost ~]# su - distro
    [distro@localhost ~]$ find /home -name .bashrc
    find: “/home/abc1”: 权限不够
    find: “/home/user2”: 权限不够
    find: “/home/abc9”: 权限不够
    find: “/home/abc7”: 权限不够
    /home/distro/.bashrc
    ......
    
    //将上述命令的执行结果,正确的输出至list_right文件,错误的输出至list_error文件;
    [distro@localhost ~]$ find /home -name .bashrc > list_right 2>list_error
    
    [distro@localhost ~]$ ll list_right 
    -rw-rw-r--. 1 distro distro 40 5月  28 03:33 list_right
    [distro@localhost ~]$ ll list_error 
    -rw-rw-r--. 1 distro distro 1232 5月  28 03:33 list_error
    

    (6)/dev/null垃圾黑洞设备与特殊写法

    • 合并正常输出流和错误输出流:
      1)常用选项: &>,&>>
      2)命令格式
    COMMAND >  /path/to/somefile 2>&1
    COMMAND>> /path/to/somefile 2>&1
    
    • 特殊设备:/dev/null

    实例

    //合并正常输出流和错误输出流
    [distro@localhost ~]$ find /home -name .bashrc > list 2>&1 
    [distro@localhost ~]$ ll list
    -rw-rw-r--. 1 distro distro 1272 5月  28 03:47 list
    
    //将命令执行后的错误信息输出至/dev/null丢弃
    [distro@localhost ~]$ find /home -name .bashrc 2>/dev/null
    /home/abc2/.bashrc
    /home/distro/.bashrc
    

    (7)输入重定向

    1)cat命令

    • cat > /path/from/somefile << EOF
      以键盘为输入,将信息输出到somefile,并在输入EOF时结束输入

    实例

    //利用cat创建一个文件,使用键盘输入文件内容
    [root@localhost ~]# cat > catfile
    hello world
    cat file test
    [root@localhost ~]# cat catfile
    hello world
    cat file test
    
    //用stdin替代键盘的输入
    [root@localhost ~]# cat > catfile < ~/.cshrc
    [root@localhost ~]# ll catfile ~/.cshrc
    -rw-r--r--. 1 root root 100 5月  28 03:56 catfile
    -rw-r--r--. 1 root root 100 9月  23 2004 /root/.cshrc
    
    //cat将输入的信息输出到catfile,且当键盘输入eof时,结束输入
    [root@localhost ~]# cat > catfile << "eof"
    > this is a test
    > hello world
    > eof
    [root@localhost ~]# 
    

    (8)双向重定向

    1)tee命令

    • tee会同时将数据流送与文件与屏幕;
    • 输出到屏幕的,就是stdout,可以让下个命令继续处理。

    命令格式与选项

    tee [-a] file
    -a:以累加的方式,将数据加入file当中
    

    实例

    //将last的输出存一份到last.list中
    [root@localhost ~]# last | tee last.list | cut -d " " -f1
    mageia
    root
    ......
    wtmp
    
    //将ls的数据存一份到 ~/homefile,同时屏幕也有输出信息
    [root@localhost ~]# ls -l /home | tee -a ~/homefile | more
    总用量 148
    drwx------. 3 user_g       4016  4096 5月  16 18:28 abc1
    drwx------. 3     4025     4025  4096 5月  16 18:28 abc10
    drwx------. 3 distro       4017  4096 5月  16 18:28 abc2
    ......
    
    //tee后接的文件会被覆盖,若加上-a这个参数则能将信息累加
    [root@localhost ~]# ls -l / | tee -a ~/homefile | more
    总用量 106
    dr-xr-xr-x.   2 root root  4096 8月  15 2017 bin
    dr-xr-xr-x.   5 root root  1024 7月   2 2017 boot
    ......
    drwxr-xr-x.  20 root root  4096 7月   2 2017 var
    

    2.管道

    • 连接程序,实现将前一个命令的输出直接定向后一个程序当做输入数据流

    命令格式

    COMMAND1 | COMMAND2 | COMMAND3 | ...
    

    注意

    • 管道命令仅会处理standard output,对于standard error output会予以忽略
    • 管道命令必须要能够接收来自前一个命令的数据成为standard input继续处理才行

    1)tr命令

    命令格式

     tr [OPTION]... SET1 [SET2] 
    
    • 把输入的数据当中的字符,凡是在SET1定义范围内出现的,通通对位转换为SET2出现的字符;

    常用方法:

    • 用法1:
      tr SET1 SET2 < /path/from/somefile
    • 用法2:
      tr -d SET1 < /path/from/somefile
      注意:不修改原文件

    实例

    • 1.把/etc/passwd文件的前6行的信息转换为大写字符后输出
    [root@localhost ~]# head -n 6 /etc/passwd | tr 'a-z' 'A-Z'
    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
    
    • 参考书籍:《鸟哥的Linux私房菜--基础学习篇》

    相关文章

      网友评论

          本文标题:IO重定向及管道

          本文链接:https://www.haomeiwen.com/subject/fipdjftx.html