第四章标准I/O和管道学习笔记

本章内容

三种I/O设备

把I/O重定向至文件

使用管道

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

 

标准输入和输出

程序:指令+数据

读入数据: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

 

 

tr命令:转换和删除字符

格式:

tr [OPTION]…set1 [set2]

如:

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

[root@sentos7 ~]#tr ‘a-z’ ‘A-Z’

afafj;k

AFAFJ;K

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

tr abc      xyzo

[root@sentos7 ~]#tr abc xyzo

abcd

xyzd

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

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

tr abcd xyz

[root@sentos7 ~]#tr abcd xyz

abcd

xyzz

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

最后一个字符

tr -t abcd xyz        (–truncate-set1)

[root@sentos7 ~]#tr -t abcd xyz

abcd

xyzd

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

集2的最后一个字符

tr -s abcd xyz        (–squeeze-set1)

[root@sentos7 ~]#tr -s abcd xyz

aaaaabbbbbcccccdddddaaaaaddddd

xyzxz

[root@sentos7 ~]#tr -s ” ”

a    b    c    d

a b c d

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

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

会生效,如:

[root@sentos7 ~]#tr -s “abc ” xyz

aabbcc    bbdd   ssaabb  aaa

xyzyddzssxyzx

^C

[root@sentos7 ~]#tr -st “abc ” xyz

aabbcc    bbdd   ssaabb  aaa

xyz    ydd   ssxy  x

^C

[root@sentos7 ~]#tr -s “abc ” xyzo

aabbcc    bbdd   ssaabb  aaa

xyzoyddossxyox

^C

[root@sentos7 ~]#tr -s “abc ” “xyz ”

aabbcc    bbdd   ssaabb  aaa

xyz ydd ssxy x

tr -d abc

[root@sentos7 ~]#tr -d abc

aaabbbbcccddddeeeaafff

ddddeeefff

^C

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

 

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

[root@sentos7 ~/Music]#tr -c abc x

fafjakl;uifajl

xaxxaxxxxxxaxxx[root@sentos7 ~/Music]#

 

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

[root@sentos7 ~/Music]#tr -dc abc

jafkabbafaaaaccccafjifiejfa

aabbaaaaaccccaa[root@sentos7 ~/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…

如:

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,正文为随意

[root@sentos7 /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

 

 

 

 

 

 

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/94904

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code