9.I/O重定向和管道

标准输入重定向(STDIN,文件描述符为0):默认从键盘输入。
标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕。
错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕。

1.IO重定向


IO重定向:就是把一些默认输入输出修改默认的位置。

例如:
#tty
/dev/pts/0 查看当前终端号
#hostname
Centos7.localdomain 默认输出在当前终端/dev/pts/0
#hostname > /dev/pts/1 这样就把输出在/dev/pts/1窗口显示

但是更多的是我们把输出重定向到文件内。
[root@Centos7 data]#hostname >> demo
[root@Centos7 data]#cat demo
Centos7.localdomain

2.重定向符号


命令 < 文件:将文件作为命令的标准输入,默认不写就是1
命令 > 文件:将标准输出内容写到一个文件中,覆盖原文件内容
命令 2> 文件:将错误输出内容写到一个文件中,覆盖原文件内容
命令 >> 文件:将标准输出内容写到一个文件中,追加到原有内容的后面
命令 2>> 文件:将错误输出内容写到一个文件中,追加到原有内容的后面
命令 >> 文件 2>&1 :将标准输出与错误输出一起写到文件中,追加到原有内容的后面
命令 &>> 文件:功能同上

例子:

1.#cat > f1  回车之后在在键盘输入 a b c
a b c
把标准输入内容写到f1文件中。

2.#cat < f1 查看f1文件等价于 cat f1

3.#cat <f1 >f2 把f1的标准输出当作f2的标准输入,也就是f1内容覆盖到f2

4.#cat <f2 >>f2  死循环把f2内容追加到f2本身。

3.多重重定向


应用: 常用在写脚本的时候,来写一些配置文件。

[root@Centos7 data]#cat >f2.log <<EOF
> hello
> hello
> world 
> goodby
> EOF
[root@Centos7 data]#cat f2.log 
hello
hello
world
goodby

4.管道


管道:就是把前一个命令的标准输出,用作下一个命令的标准输入。

管道实现的小功能:
实现1-100相加

#echo {1..100} |tr ' ' '+'|bc
#seq -s"+" 100 | bc

通过下面的小练习可以加深对管道的理解:

1、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中
#tr 'a-z' 'A-Z' < /etc/issue > /data/issue.out

2、将当前系统登录用户的信息转换为大写后保存至/tmp/who.out文件中
#logname | tr 'a-z' 'A-Z'>/data/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 here,please help me to check it,thanks!$(cat /etc/centos-release)
> EOF

4、将/root/下文件列表,显示成一行,并文件名之间用空格隔开
#ls -1 | tr '\n' ' '

5、计算1+2+3+..+99+100的总和
#seq -s + 100 |bc

6、删除Windows文本文件中的‘^M’字符
#tr -d '^M'

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 "[:blank:][:digit:]"

8、将PATH变量每个目录显示在独立的一行
#echo $PATH|tr ':' '\n'

9、将指定文件中0-9分别替代成a-j
#cat demo 
0123456789
#cat demo |tr '0-9' 'a-j'

10、将文件/etc/centos-release中每个单词(由字母组成)显示在独立的一行,并无空行
#cat /etc/centos-release | tr -d '\n'|tr ' ' '\n'

5.tee命令


应用:tee命令可以把标准输出保存在一个文件中,同时还能打印出来,或者同时做为下一个命令的标准输入。
这里写图片描述

例子:

1.#ls | tee f1.log 即在屏幕上打印,也把结果写到文件f1.log中
[root@Centos7 data]#ls | tee f1.log
f1.log
file1
file2
file3
file4
[root@Centos7 data]#cat f1.log 
f1.log
file1
file2
file3
file4


2.即把ls内容保存在f1.log文件中,也作为下一个命令的标准输入
[root@Centos7 data]#ls | tee f1.log |tr 'a-z' 'A-Z'
F1.LOG
FILE1
FILE2
FILE3
FILE4

3.如果要追加到f1.log文件中,而不是覆盖f1.log内容,用到-a
[root@Centos7 data]#hostname |tee -a f1.log |tr 'a-z' 'A-Z'
CENTOS7.LOCALDOMAIN
[root@Centos7 data]#cat f1.log 
f1.log
file1
file2
file3
file4
Centos7.localdomain

猜你喜欢

转载自blog.csdn.net/chen2499152/article/details/81272896
今日推荐