Linux IO重定向及管道

一,标准输入输出:

    程序 : 指令+数据 

    程序 :IO

可用于输入的设备:文件,键盘设备,文件系统上的常规文件,网卡等;

可用于输出的设备:文件,显示器,文件系统上的常规文件,网卡等,



程序的数据流有三种:

    输入的数据流:<–  标准输入(stdin),键盘

    输出的数据流: –>标准输出(stdout),显示器

    错误输出流:  –>错误输出(stderr), 显示器

fd:file descriptor 文件描述符

Linux 给程序提供三种I/O设备:

    标准输入(STDIN):0 默认接受来自键盘的输入 

    标准输出(STDOUT):1 默认输出到终端窗口 

    错误输出(STDERR):2 默认输出到终端窗口 


IO重定向:改变默认位置

STDOUT和STDERR 可以被重定向到文件,支持的操作符号包括:

    >   把STDOUT重定向到文件

    2>  把STDERR重定向到文件

    &>  把所有输出重定向到文件


输出重定向:>

特性:覆盖输出!(很危险)

特殊设备: /dev/null    ##任何数据放到里面都会丢弃

blob.png

# set  -C (仅对当前shell有效)

   禁止覆盖输出已存在的对象

ls /etc  > /tmp/out.txt    #强制覆盖输出 >|


# set  +C

    关闭上述特性


blob.png

ls /etc  > /tmp/out.txt

ls /etc  > /dev/sda           //可能会干掉你的硬盘数据


输出重定向:>>

特性:追加输出!

错误输出流  

    2>   : 覆盖重定向错误输出数据流

     2>>  : 追加重定向错误输出数据流

标准输出和错误输出各自重定向至不同位置

    COMMAND > /PATH/TO/FILE.OUT 2> /PATH/TO/ERRORFILE.OUT

合并正常和错误输出流

    &> 覆盖重定向

    &>> 追加重定向 

     COMMAND > /path/to/file.out 2> &1 (顺序很重要) 

     COMMAND >> /path/to/file.out 2>> &1


   find /etc -name passwd 2> /dev/null


    ():合并多个程序的STDOUT ( cal 2007 ; cal 2008 ) > all.txt

     ls /etc  >> /tmp/out.txt  2>&1


输入重定向  < :

   使用<来重定向标准输入

   某些命令能够接受从文件中导入的STDIN:

      # tr 'a-z' 'A-Z' < /etc/issue     //该命令将issue文件中的小写字母全部转换为大写

blob.png

 tr –d abc < /etc/fstab 删除fstab文件中的所有abc中任意字符 

blob.png

文档终止词 <<

使用 << 命令从键盘把多行重导向给STDIN,直到 终止词 位置的所有文本都发给STDIN

blob.png


tr命令:

tr[OPTION]… SET1 [SET2]:把输入的数据当成字符,把set1的字符对位转换set2的字符

###  tr  [a-z]  [A-Z] < /etc/issue         把/etc/issue中的所有字符转化为大写并输出到屏幕上

blob.png

tr  -d '[A-Z]' < /etc/issue   把/etc/issue 中的大写字母移除

Here Document:  <<

cat << EOF

cat > /tmp/out.txt <<EOF

命令参数

  • -c或——complerment:取字符集的补集 

  • -d或——delete:删除所有属于第一字符集的字符 

  • -s或—squeeze-repeats:把连续重复的字符以单独一个字符 表示 

  • t或–truncate-set1:将第一个字符集对应字符转化为第二 字符集对应的字符




管道:|   

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

    STDERR默认不能通过管道转发,可利用2>&1 或 |& 实现 


    blob.png

     blob.png    


tee命令:

#命令1 | tee 文件名 | 命令2 

 把命令1的STDOUT保存在文件名中,然后管道输入给命令2 


使用: 

    保存不同阶段的输出 

    复杂管道的故障排除 

    同时查看和记录输出


因此可以定向到多个目标,比如要在屏幕显示,又要保存到磁盘,那么

[root@localhost etc]# ls /etc/ | tee /tmp/out.txt | tr 'a-z' 'A-Z'

blob.png


将command结果输出到屏幕上,又保存了一份在磁盘上,由于tr名字在最后执行,因此结果如下

blob.png 



实战训练

1、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中 

    cat /etc/issue | tr 'a-z' 'A-Z' > /tmp/issue.out


2、将当前系统登录用户的信息转换为大写后保存至/tmp/who.out文件中 

    who | tr 'a-z' 'A-Z' > /tmp/who.out


3、一个linux用户给root发邮件,要求邮件标题为”help”,邮件正文如下: Hello, I am 用户名,the system version is here,please help me to  check it ,thanks! 操作系统版本信息 

    

mail -s "help" root <<eof

> Hello, I am $USER ,the system version is cat /etc/centos-release,please help me to  check it ,thanks!

> eof


blob.png

4、将/root/下文件列表,显示成一行,并文件名之间用空格隔开

    ls /root/ | tr '\n' ' '


5、file1文件的内容为:”1 2 3 4 5 6 7 8 9 10” 计算出所有数字的总和 

    cat file1 | tr ' ' '+' | bc


6、删除Windows文本文件中的'^M'字符 

    tr -d '\r' < 1.txt | tee 2.txt


7、处理字符串“xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4”,只保留其中的数字和空格 

    echo $"xt.,l 1 jr#-limn2 c*/fe3 uz4" |  tr -d [:alpha:],[:punct:]


8、将PATH变量每个目录显示在独立的一行 

    echo $PATH | tr ':' '\n


9、删除指定文件的空行 

    cat lss | tr -s '\n'


10、将文件中每个单词(字母)显示在独立的一行,并无空行

    cat lss |tr ' ' '\n'| tr -s '\n'


类似文章