一、标准输入和标准输出
1.程序:指令+数据;
数据:
读入数据:Input
输出数据:Output
2.打开的文件都有一个fd:file descriptor(文件描述符)
3.Linux给程序提供的三种I/O设备:
标准输入:0,默认接受来自键盘的输入;
标准输出:1,显示器(默认输出到终端窗口)
标准错误输出:2,显示器(默认输出到终端窗口)
二、把标准输出和标准错误输出重定向到文件
1.标准输出和标准错误输出可以被重定向到文件:
格式:命令 操作符号 文件名;
支持的操作符号:
>:把标准输出重定向到文件;
2>:把标准错误输出重定向到文件;
&>:把标准输出和标准错误输出重定向到文件;
2.输出重定向:COMMAND > NEW_POS,COMMAND >> NEW_POS;
>:覆盖重定向:文件不存在,则会自动创建;文件如果有内容,则会覆盖;
eg:ls > /testdir/is.log
>>:追加重定向,在原有内容基础上,追加内容;新内容会追加至目标文件尾部;
eg:uname -r >> /testdir/is.log
set -C:禁止将内容覆盖已有文件,但可追加;强制覆盖:>|;
set +C:允许覆盖;
2>:覆盖重定向标错误输出数据流;
eg:aaaaa 2> /testdir/is.log
2>>:追加重定向错误输出数据流;
eg:bbbbb 2>> /testdir/is.log
标准输出和错误输出各自定向至不同位置:
COMMAND > /path/to/somfile 2> /path/to/err.out
eg:ls /boot /ddddd /testdir/f1 2> /testdir/f2
合并标准输出和错误输出为同一个数据流进行重定向:
&>:覆盖重定向;
&>>:追加重定向;
COMMAND &> /path/to/file.out;
eg:ls /boot /ddddd &> /testdir/all.log
COMMAND &>> /path/to/dile.out
eg:ls /boot /ddddd &>> /testdir/all.log
3.():合并多个程序的标准输出
eg:(pwd;ls) > /testdir/all.log
三、输入重定向:<
1.tr命令
tr:转换或删除字符;
语法:tr [OPTION]...SET1 [SET2]
字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数“字符集2”指定转换的目标字符集。但执行删除操作时,不需要参数“字符集2”;
字符集2:指定要转换成的目标字符集。
OPTION:
-c:取字符集的补集(也就是取反);
-d:删除所有属于第一字符集的字集;
-s:把连续重复的字符以单独一个字符表示;也可以用-s来转换字符(等同于tr [a-z] [A-Z] < /etc/issue);
-t:将第一个字符集对应字符转化为第二字符集对应的字符;
字符集表示方法:
[:lower:]:任意小写字母;
[:upper:]:任意大写字母;
[:alpha:]:任意大小写字母(不区分大小写);
[:alnum:]:任意数字和字母;
[:blank:]:水平空白字符;
[:space:]:水平或垂直空白字符;
[:punct:]:标点符号;
[:print:]:可打印字符;
[:cntrl:]:控制(非打印)字符;
[:graph:]:图形字符;
[:xdigit:]:十六进制字符;
速记符含义八进制方式
\b Ctrl-H 退格符\010
\f Ctrl-L 走行换页\014
\n Ctrl-J 新行\012
\r Ctrl-M 回车\015
\t Ctrl-I tab键\011
eg1:tr 'abc' 'xyz':这里不是将abc转换成xyz,是对应转换,a转换成x,b转换成y,c转换成z;
eg2:tr 'abc' 'xy':a转换成x,b转换成y,c转换成z;由于c没有对应转换项,会在xy后自动加个y来形成对应关系;
eg3:tr 'ab' 'xyz'::a转换成x,b转换成y,c转换成z;由于没有与z形成对应关系的项,它不会自动添加项;
eg4:tr 'a-z' 'A-Z' < /etc/issue;将文件中的小写字母转换成大写字母;
eg5:tr 'a-z' 'A-Z' < /etc/issue > f1;将文件中的小写字母转换成大写字母并重定向到f1文件中;
eg5:tr -s
eg6:tr -d
【注意】这里,凡是在file文件中出现的'S','n','a','i','l'字符都会被删除!而不是紧紧删除出现的"Snail”字符串。
eg7:tr -c
四、多行标准输入重定向
1.使用“<<终止词”命令从键盘把重导向给标准输入;
eg1:
eg2:用来发邮件
五、管道
1.管道(使用符号“|”表示)用来连接命令;
命令1 | 命令2 | 命令3 | ...
1.1.将命令1的标准输出送给命令2的标准输入,命令2的标准输出送给命令3的标准输入;
注:最后一个命令会在当前shell进程的子shell进程中执行;
eg1:ls | tr 'a-z' 'A-Z'
eg2:echo centos7 | passwd --stdin wu > /dev/null
1.2.标准错误输出默认不能通过管道转发,可利用2>&1或|&实现;
eg: ls aaaaa |& tr 'a-z' 'A-Z'
六、重定向到多个目标(tee)
tee命令:从标准输入读取并写入标准输出和文件
1.命令1 | tee 文件名 | 命令2
把命令1的标准输出保存在文件名中,然后管道输入给命令2;
2.使用:
2.1.保存不同阶段的输出;
2.2.同时查看和记录输出
eg:who | tee f1 | tr 'a-z' 'A-Z'