第四章标准I/O和管道

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第四章标准I/O和管道相关的知识,希望对你有一定的参考价值。

笔记整体起始时间:2018年4月2日18:55:25

 

本章内容

        三种I/O设备

        把I/O重定向至文件

        使用管道

 

标准输入和输出

        程序:指令+数据

               读入数据:Input

               输出数据:Output

        打开的文件都有一个fd:file  description(文件描述符)

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

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

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

               标准错误(STDERR) -2    默认输出到终端窗口

        I/O重定向:改变默认输入输出位置。

 

把输出和错误重新定向到文件

        STDOUT和STDERR可以被重定向到文件

               命令操作符号 文件名

        支持的操作符号包括:

               >     把STDOUT重定向到文件 1>

                     cat /etc/motd  >f1

               2>   把STDERR重定向到文件

                     cd /error  2>f2

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

                     cat /etc/issue /error2  &>f3         老系统可能不支持

        > 重定向文件内容会被覆盖

               set -C      禁止将内容覆盖已有文件,但可追加

               >| file      强制覆盖

               set +C    允许覆盖

        >> 原有内容基础上,追加内容

               如:

                     cat /error 2>file1   将错误输出重定向覆盖写入  file1

                     cat /error  2>>file1 将错误输出重定向追加写入 file1

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

               cmd >/path/file.out 2>/path/error.out 如:

               cat /etc/motd /error >/root/Music/file1  2>/root/Music/file2

        合并标准输出和错误输出为同一数据流进行重定向

               &>  覆盖重定向

                     cat /etc/issue /error2  &>f3

               &>>        追加重定向

                     cat /etc/issue /error2  &>>f3

               cmd >out1 2>&1          覆盖

               cmd >>out2 2>&1               追加

               其他写法:

                     cmd 2>out3 >@2                      偏门

                     (ls /error /data  2>&1)>ff6    括号

                     (ls /error /root  >&2) 2>ff7   偏门的括号

                     错误写法:cmd 2>&1 >ff5

               顺序很重要。

        (),合并多个程序的STDOUT

               (cal 2007;cal  1998) >cal

               (cal,cal 8453531213554) >cal1 2>&1  

                                                  or:&>cal2

        有些命令输出需要隐藏起来或者销毁,重定向/dev/null,如

               hostname > /dev/null

               echo redhat |passwd --stdin wang &>  /dev/null

        

 

tr命令:转换和删除字符

        格式:

        tr [OPTION]...set1 [set2]

        如:

               tr 'a-z' 'A-Z'  运行结果为:

                     [[email protected] ~]#tr 'a-z' 'A-Z'

                     afafj;k

                     AFAFJ;K

                     将输入的小写字母转化为大写字母

               tr abc       xyzo

                     [[email protected] ~]#tr abc xyzo

                     abcd

                     xyzd

                     将字符集1(abc)转化为字符集2(xyzo)

                     若字符集2比较长,则多出部分无效

               tr abcd xyz

                     [[email protected] ~]#tr abcd xyz   

                     abcd

                     xyzz

                     如字符集1比字符集2长,则余下字符全部会转化为字符集2的

                     最后一个字符

        tr -t abcd xyz        (--truncate-set1)

               [[email protected] ~]#tr -t abcd  xyz

               abcd

               xyzd

               选项-t,要求一一对应,当字符集1比较长时,多出部分不再匹配字符

               集2的最后一个字符

        tr -s abcd xyz        (--squeeze-set1)

               [[email protected] ~]#tr -s abcd xyz  

               aaaaabbbbbcccccdddddaaaaaddddd

               xyzxz

               [[email protected] ~]#tr -s " "

               a    b    c     d               

               a b c d

               把字符集1中,连续的重复的字符以单独的字符显示

                     如存在字符集2,则要求必须在字符集2中存在对应字符的字符才会才

                     会生效,如:

               [[email protected] ~]#tr -s "abc "  xyz

               aabbcc    bbdd   ssaabb  aaa

               xyzyddzssxyzx

               ^C

               [[email protected] ~]#tr -st "abc "  xyz

               aabbcc    bbdd   ssaabb  aaa

               xyz    ydd   ssxy  x

               ^C

               [[email protected] ~]#tr -s "abc "  xyzo

               aabbcc    bbdd   ssaabb  aaa

               xyzoyddossxyox

               ^C

               [[email protected] ~]#tr -s "abc " "xyz  "

               aabbcc    bbdd   ssaabb  aaa

               xyz ydd ssxy x

        tr -d abc

               [[email protected] ~]#tr -d abc

               aaabbbbcccddddeeeaafff

               ddddeeefff

               ^C

               删除字符集1中的字符,不可加字符集2,否则报错

 

        tr -c abc x       取字符集的补集替换成x

               [[email protected] ~/Music]#tr -c abc  x

               fafjakl;uifajl

               xaxxaxxxxxxaxxx[[email protected]  ~/Music]#

        

        tr -dc abc      删除abc以外的所有字符,默认按ctrl+D输出

               [[email protected] ~/Music]#tr -dc  abc

               jafkabbafaaaaccccafjifiejfa

               aabbaaaaaccccaa[[email protected]  ~/Music]#

        

        字符集支持glob通配符

                     \nnn       character with octal value NNN (1 to 3  octal digits)

                   八进制数nnn代表的ASCII字符

                     \\            backslash \

                     \a           audible BEL   可听见声音

                     \b           backspace             退格

                     \f            form feed             换页

                     \n           new line         换行

                     \r            ruturn                   回车

                     \t            horizontal tab 水平tap

                     \v          vertical tab     垂直tap

        

               [:alnum:] [:alpha:]  [:digit:]    [:lower:]   [:upper:]

               [:xdigit:]    [:punct:]  [:space:]  [:gtaph:]   [:cntrl:]

               [:print:]

        

从文件中导入STDIN

        使用<来重定向标准输入

               支持标准输入的命令|

                     cat tr mail bc  

                     more less head tail cut wc  sort uniq grep。。。

        如:

               cat </etc/issue              将/etc/issue的内容作为cat命令的标准输入

               tr 'a-z' 'A-Z' </etc/issue

                     将/etc/issue中的小写字符都转换成大写字符

               tr -d abc < /etc/fstab 删除fstab文件中的所有abc

               cat > file1       

                     将cat的标准输出保存到file1,默认第一次回车清空,后面每次

                     回车都会追加写入

               cat > file1 <file2

                     输入file2中的内容输出到file1

                     (cat >f1 <f1,文件清空)

                     (cat <f1 >>f1,无限写入)

把多行发送给STDIN

        使用"<<终止词"命令从键盘把多行重导向给STDIN

               直到终止词 位置的所有文本都发送给STDIN

               有时被称为就地文本(heretext)

        cat >file1 <<END   

               直到输入END时,内容才会被写入文件

        mail -s nihao hello <<END

               给hello发邮件,标题是nihao,以END为结束字符

 

实例:

        tr -dc [:alpha:] < /etc/profile  >ff1

               将/etc/profile中内容仅保留数字和字母之后写入ff1

        tr 'a-z' 'A-Z' < /etc/motd

               显示/etc/motd,且将所有小写字母转化为大写字母

        tr -d ‘\r' <win.txt >win2.txt

               删除windows的txt格式文件中所有的\r(\15,0d,^M)

        tr '\n' '\t' <linux.txt

               将文件linux.txt中的回车转换成tap显示

        tr ’\n' '\v' <linux.txt

               将文件linux.txt中的回车转换成垂直tap显示

        tr -d ‘\n' <linux.txt

               删除文件linux.txt中的回车键之后显示

        tr -s ’ ’ < ff15

               显示ff15中的信息,压缩空格

        df >df.log

               将df的输出保存至文佳df.log

        tr -s ' ' < df.log

               将df.log中的信息压缩空格之后显示

        tr -s ' ' ':' < df.log

               将df.log中的空格压缩且替换成:之后显示

        tr [:lower:] [:upper:]  <<END

               多行转换小写为大写,已END为终止符

        cat > mail.to.hello

               重定向将信件写入mail.to.hello文本

        mail -s nice hello < mail.to.hello

               发送邮件mail.to.hello给hello,标题为nice

        

管道:

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

               命令1 | 命令2 |  命令3 |...

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

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

        最后一个名字会在当前shell进程的子shell进程中执行

        组合多种工具的功能

               

        ls | tr 'a-z' 'A-Z'

               将ls输出结果中的小写字母转换成大写

        hostname | tr 'a-z' 'A-Z' | tr -d '.'

               将hostname输出的小写字母换成大写,并删除字符'.' 

        cat mail.to.hello | mail -s nihao  hello

               使用管道发送邮件mail.to.hello给hello,标题是nihao

        ls /boot /error 2>@1 | tr 'a-z' 'A-Z'

               两种写法        |&

               将ls /boot /error 的标准输出和标准错误中的小写换成大写

        ls /boot /error |& tr 'a-z' 'A-Z' | tr ' ' ':'  >>f1

               将ls boot /error 的标准输出和标准错误中的小写换成大写,且将

               空格换成冒号,追加保存到文件f1

        df | tr -s ' ' ':'

               将df命令的空格压缩显示换成冒号

        df | tr -c ' ' ':'

               将df命令的空格以外的字符换成':'显示

        df | tr -c [:alpha:] ':'

               将df命令的字母以外的字符换成':'显示

        echo 1+2+3 | bc

               计算1+2+3的和

        echo {1..100} | tr ' ' '+' |  bc

               计算1-100的和

        seq -s ' ' 10

               生成数字1-10 中间以空格隔开

        seq -s + 100 | bc

               1+到100的另一种写法

 

相关命令:

        less:一页页的查看输入

               ls -l /etc | less

                     将ls  -l /etc的结果一页一页的输出

               man less |less

        mail:通过电子邮件发送输入

               echo "test email" | mail -s nihao hello

                     发送test email 给hello 标题为nihao

        lpr:把输入发送给打印机

               echo "test print" |lpr -P printer_name

                     通过pingter_name 打印输入test  print

        tar命令

        未介绍 tar -cvf - /home | tar -xvf  -

 

重定向到多个目标:tee

        命令1 |tee [-a] 文件名 |  命令2

               把命令1的STDOUT保存在文件中,作为命令2的输入

               -a 追加

        使用:

               保存不同阶段的输出

               复杂管道的故障排除

               同时查看和记录输出

        实例:

               echo "test email" |tee -a ff13| mail -s nihao hello

                     将“test email”保存至ff13,且作为邮件内容发送给hello 标题nihao

               ls -l |tee -a ff11| tr ' ' '.'

                     将ll  -l 的结果保留至ff11,且将空格转化为.输出

 

习题

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

               cat /etc/issue | tr 'a-z' 'A-Z' >  /data/issue.out1

               tr 'a-z' 'A-Z' < /etc/issue >  /data/issue.out2

        2.将当前提供登录用户的信息转换为大写后保存至/dada/who.out中

               who | tr 'a-z' 'A-Z' >/data/who.out1

        3.一个linux用户给root发邮件,要求邮件标题为help,正文为随意

               [[email protected] /data]#mail -s help hello  <<END

               > Hello,i am $USER,

               > The,system version is here,please help me  to check it

               > thanks!

               > `lsb_release -a`

               >END

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

               ls /root |tr '\n' ' '

        5.计算1+2...+100的总和

               echo {1..100} | tr ' ' + |  bc

               seq -s + 100 |bc

        6.删除windows文本文件中的'^M'字符

               tr -d '\r' < /root/win.txt >win1.txt

               \r的其他写法\15

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

               echo "xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4" | tr -dc  '[:digit:][:space:]'

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

               echo $PATH |tr ':' '\n'

        9、将指定文件中0-9分别替代成a-j

               tr '0-9' 'a-j' < /etc/profile

?    10、将文件/etc/centos-release中每个单词(由字母组成)显示在独立的

        一行,并无空行

               cat /etc/centos-release |tr -c '[:alpha:]' ' ' |  tr -s ' ' '\n'

        

 

 

笔记整理完成时间:2018年4月3日17:24:38

 

 


以上是关于第四章标准I/O和管道的主要内容,如果未能解决你的问题,请参考以下文章

第四章输入/输出(I/O)4.2PCL中I/O模块及类介绍

组原第四章练习题

第四章输入/输出(I/O)4.1I/O涉及的设备及相关概念简介

标准I/O和管道

标准I/o重定向和管道

标准I/O重定向和管道