标准输入输出和管道 

三种输入和输出设备

把输出和输入重定向到文件

使用管道连接命令

一.标准:

    输入(STDIN)-0,默认是键盘鼠标的输入窗口

    输出(STDOUT)-1,默认设备当前终端窗口

    错误(STDERR-2,默认当前终端窗口

1

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

wKiom1eeDIOxT_-OAADkmcrMCdI237.png-wh_50 

,输入输出重定向;改变文件位置

1> 输出STDOUT重定向到文件

   2>STDERR重定向到文件

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

     > 文件内容会被覆盖 

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

   < 标准输入的重定向

 

把标准输出,切换到别的终端;用>号。如下图所示

wKioL1eeDYyy6ZtuAAAwhRO20Xc363.png-wh_50

wKiom1eeDcmClLhwAAAbm8IjCgE807.png-wh_50

2,定向到文件,如果文件名不存在,它会自己生成文件名

如果说再往 ls.log定向一个文件,那么它的原有数据就会覆盖

 

举例:下图以ls为例

wKiom1eeDeiw2bACAAAZn7sLSWA717.png-wh_50


3.把错误的重定向到文件,用2>号。如下图所示

wKioL1eeDf-DH8oqAAASAaU1L6E206.png-wh_50 

如果>号前边不加2 ,就系相当与把文件清空了文件里什么也没有

如下图

wKioL1eeDiPyAE9AAAAM6xuWzlM727.png-wh_50 

4,如果想把错误的和正确的都放一个文件里,得用&>

如下图所示

wKiom1eeDkLwO-fvAABO4VTLuLA876.png-wh_50 

5,如果想错的对的都放一块,如下图所示

wKioL1eeDlnjCoG9AAAvJ4_uuno635.png-wh_50 

旧版本的系统支持2>&12>&1必须放到最后,命令如下图所示

wKiom1eeDnOzotRzAAA0Y719eA8000.png-wh_50 

6把两个命令的标准输出,都定向到一个文件里得用(命令:命令 )

wKiom1eeDoHhUg33AADUsQwAp6M658.png-wh_50 

7,>> 追加到一个文件,数据不会覆盖,如下图

wKioL1eeDpLDACY5AACJ4Gg-P3M455.png-wh_50 

8.>标准输入的重定向,可以代替键盘输入的信息,进行一些批量的处理。

命令如下发一个邮件,执行完后输入内容,最后输.结束

wKiom1eeDrrxi0FYAAAORqZWsIU229.png-wh_50 

如果我想群发邮件,可以用nano mail.txt ,在里面写上内容 ,就不用一个一个写了。

wKioL1eeDs-DHnj9AAAMW8yH_hs399.png-wh_50 

然后使用标准输入群发邮件。命令如下图

wKiom1eeDtzBtxn6AAAGCJZt7wY980.png-wh_50 

9<<标准输入多行重定向 导入到文件里,输入e结束才会存到f1.

如下图,

 

 wKiom1eeDuvQP2jRAAANP4D6p9c142.png-wh_50

 

三,tr命令是转换和删除字符的命令

 

选项

-c——complerment:取字符集的补集

-d——delete:删除所有属于第一字符集的字符;

-ssqueeze-repeats:把连续重复的字符以单独一个字符表示

-t--truncate-set1:先删除第一字符集较第二字符集多出的字符

1,转小写字符为大写字符,而且可以用标准输入。把全部文件的内容转换为大写,并且定向到f1文件,注意的是/etc/issue本身没有转换为大写,只是一个输入源。下图

wKioL1eeDvuR1wAkAAFY5ep-goI760.png-wh_50 

2tr -d abc 删除abc 打头的字符

wKiom1eeDwqQfO7lAAAHamM2g6Q716.png-wh_50 

3tr -s x把重复的x 用单个的x 来表示

wKiom1eeDxiAzPbcAAAICd6WI8I177.png-wh_50 

4可以横变竖排序

wKioL1eeDybjIEOrAABsc4JTXc4146.png-wh_50 

5  -c 除了补集,全部替换

wKioL1eeDzKRdzEgAABng9VyBtg264.png-wh_50 

 

 

一个linux用户给root发邮件,要求邮件标题为help,邮件正文如下:

Hello, I am 用户名,the system version is here,pleasehelp me to check it ,thanks!

操作系统版本信息

wKiom1eeD0HjoRDrAAC0Eb8fW_s621.png-wh_50 

 

管道

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

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

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

管道接收的是标准输出,而不是错误。

wKioL1eeD1KRFboEAABA0T6Tr7E050.png-wh_50 

如:Cat 是标准输出,通过管道传给mail,作为它的标准输入

wKiom1eeD1-iqCgCAAAG93M47Xc202.png-wh_50 

 

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

如:下图,错误也行,正确也行

wKioL1eeD3CAh-gfAAAXinR_xVU151.png-wh_50 

管道也可多次处理,如下图把AD删了。

wKioL1eeD33QHyFTAACRPRy3N_k107.png-wh_50 

如果用tee 命令可以在文件里和桌面两面显示,如下图

wKiom1eeD47CpbA1AAAkNHSUMoA954.png-wh_50 

还可以在转换,删掉回车换行符。下图

wKioL1eeD6GwhO28AADsp5Jgccg250.png-wh_50 

set命令

set -c 可以禁止覆盖 ,set +c 可以取消覆盖。

注意,禁止了换个终端或退出登录它不生效。

一般编写脚本用set -c, 防止覆盖,写完正在set+c取消。

 

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

wKiom1eeD7KjVKLlAAGGxAo4eB8739.png-wh_50 

 

 

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

wKioL1eeD7-Q_f6iAACqfUgF-Gc750.png-wh_50