码迷,mamicode.com
首页 > 其他好文 > 详细

输入输出重定向与管道命令

时间:2016-08-01 23:03:51      阅读:299      评论:0      收藏:0      [点我收藏+]

标签:管道 重定向 tr

                                        输入输出重定向、管道

1.文件描述符: 

   FD: 内核用来追踪在内存中已经打开的文件的属性(标识),是一个内存结构,

       需要空间来存放此信息

2.标准输入输出

   INPUT : 标准输入: stdin ,  描述符 : 0

   OUPUT: 标准输出: stdout          1

   错误输出 : stderr              2

3.  I/O 重定向

    1). 输入重定向  :  <      (输入没有覆盖的概念)

        << [EOF封装]: 此处创建文件

        常用于在脚本中创建文件或者生成菜单

        eg:        #生成菜单

        cat << EOF

        a: show a

        b: show b

        c:  show c

        EOF

        --------> a: show a

        b: show b

        c:  show c

        #把脚本生成的信息输出生成一个文档

        cat 》 /path to file.txt  << EOF

        a: show a

        b: show b

        c:  show c

        EOF

    2).输出重定向 :   > (覆盖输出)    >> (追加输出,不覆盖原内容)

    3). 强制覆盖重定向输出:     >|

    4). 错误重定向  : 2> (覆盖输出)   , 2>>(追加输出)

     5).全部信息重定向 :合并标准输出和错误输出为同一个数据流进行重定向

            &>  :  (正确和错误信息都定向)

                               等效于  cmd > /path   2>&1

                                &>>:追加重定向

     6).支持同时重定向标准的正确和错误输出 :

        cmd > /path to 1  2> /path to 2   (分别把正确、错误信息输出到指定文件)

    7).    ( ):合并多个程序的STDOUT (用;分号分割)

        ( cal 2007 ; cal 2008 ) >  all.txt

     8).   多行重定向:  用<<eof    .....    eof  封装

        eg: cat f1 <<eof

        kdkdk

        kdkdk

        eof (必须是独立的一行,不可以有空格等)

        ------》实现重定向

    9).禁止使用覆盖重定向特性 :       set -C

        回复特性:     set +C

        强制覆盖重定向输出:     >|     (在已经设置禁止覆盖时强制覆盖重定向)

        注意: 输出重定向只能用于正常的输出,无法用于错误输出

    10)./dev/null   bit bucket :位桶   ,用于丢弃任何输入到其中的数据

    11).命令执行状态结果:   使用 $?  

       执行正确: 0     错误:非零值

       自定义退出:

        exit [n]

4. 管道:   类似输出重定向的特殊实现,可以实现多重使用

    1) .管道(使用符号“ |”表示)用来连接命令

        命令1 | 命令2 | 命令3 | …

        将命令1的STDOUT发送给命令2的STDIN,命令2的

        STDOUT发送到命令3的STDIN

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

        最后一个命令会在当前shell进程的子shell进程中执行用来

        注意: 无法传递前面命令生成的变量并传递到最后的命令中,最后的命令是在子

               shell中运行,已经不处于前面生成变量的作用范围

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

    2). 管道中实现即输出到显示端又输出到后续命令的实现: T 管道

     命令  tee  

    用法: 紧跟在需要做双向输出的命令后面

    eg: cat /file | tee /tmp/abcd | wc -l       #显示file的内容并且放在/tmp/abcd文

    件中,同时输出给wc命令 显示行数

3. tr :   转换 或者 删除

    格式: tr [option]  SET1 [SET2]

    -c  补集 (除了匹配内容之外的内容)

    -d 删除符合SET1中的字符

    -s  压缩 ,将重复的字符压缩为一个字符显示

    -t   当对应转换时,后面字符组位数比前面小时,只转换后面字符组对应的位数,

    多出的不管

    \t  水平的tab

    \v 垂直的tab  可以实现阶梯状

    对应转换:  ‘abcd’ ‘efgh‘

    a->e  b->f 以此类推

    ‘abcd’‘efg‘

(注意 :当后面的字符位数不足时,把最后的g作为前面d的转换对象)

习惯上>后面接的是文件,| 后面是跟着命令,若是>后面跟着命令,有可能会把命令当做文件名.


练习:

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

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

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

whoami  | 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!

操作系统版本信息

echo -e "Hello, i am `whoami` ,the system version is here,please help me to check it ,thanks! \n

`lsb_release`" > mail -s "help" liux

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

ls -m /root | tr , \b

或者:   ls /root | tr ‘\n‘  ‘ ‘

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

echo "1 2 34 5 6 7 8 9 10" > file1

echo $[cat file1 | tr ‘ ‘ ‘+‘]

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

cat a.txt | tr -d ‘\r‘     (windows 中,文件中换行会显示为^M)

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

和空格

echo xt.,l 1 jr#!$mn2 c*/fe3 uz4| tr -cd ‘[:digit:] \n‘

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

echo $PATH | tr : ‘\n‘

9、删除指定文件中重复的空行

cat file | tr -s ‘\n‘

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

tr -cs ‘[:alpha:]‘ ‘\n‘


输入输出重定向与管道命令

标签:管道 重定向 tr

原文地址:http://195175108.blog.51cto.com/10167819/1833194

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!