第四章标准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和管道的主要内容,如果未能解决你的问题,请参考以下文章