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    ##任何数据放到里面都会丢弃

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

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

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

 

# set  +C

    关闭上述特性

 

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文件中的小写字母全部转换为大写

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

 

文档终止词 <<

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


tr命令:

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

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

 

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 或 |& 实现 

 

    

         


tee命令:

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

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

 

使用: 

    保存不同阶段的输出 

    复杂管道的故障排除 

    同时查看和记录输出

 

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

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

 

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

 

 


实战训练

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

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'

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值