IO重定向和管道
         根据冯诺依曼原理的知识,计算机运行有数据流的输入和输出,称之为IO.
         Linux中一切皆文件思想,表现为具体的文件。
         在linux中打开的文件都有一个fd(File Descriptor):文件描述符
         程序:指令+数据
                 读入数据:Input
                 输出数据:Output  

Linux给程序提供三种I/O设备:

1、 标准输入(STDIN): -0 默认为接受键盘输入
2、 标准输出(STDOUT):-1 默认为输出到终端窗口
3、 标准错误(STDERR):-2 默认为输出到终端窗口
注:标准错误是解释器辅助输出,并不是命令本身输出。
I/O重定向:改变默认数据流向

重定向

STDOUT和STDERR可以被重定向至文件
格式:命令 操作符号 文件名
原有内容被覆盖:
1.>或1>:将标准输出重定向至文件,文件原内容被覆盖,1>前面的1可以省略。
2.2>: 把标准错误重定向至文件
原有内容保留,其后追加:
1.1>>或1>>:把STDOUT重定向至文件,在文件原有内容后追加
2.2>>: 把标准错误重定向至文件,在文件原有内容后追加

合并STDOUT和STDERR重定向至同一文件:
&>:把STDERR和STDOUT一起重定向至文件,文件原有内容会被覆盖
&>>:把STDERR和STDOUT一起重定向至文件,在文件原有内容后追加
COMMAND > FILE.OUT 2&>1:将STDOUT覆盖重定向至FILE.OUT,并将STDERR转化为STDOUT,结果为STDOUT和STDERR一同被覆盖重定向至FILE.OUT;
COMMAND >> FILE.OUT 2&>1:将STDOUT追加重定向至FILE.OUT,并将STDERR转化为STDERR,结果为STDOUT和STDERR一同被追加重定向至FILE.OUT
set -C: 禁止覆盖重定向
set +C:解除禁止覆盖重定向

|:强制覆盖重定向
标准输出和错误输出分别重定向到不同文件中:
COMMAND > /PATH/TO/FILE.OUT 2> /PATH/TO/FILE.ERROR
合并输出流重定向,是2&>1还是1&>2,顺序很重要;
多个命令合并输出,需要加括号(CMD1;CMD2...)>file

特殊设备:/dev/null
eg:head -1 /etc/passwd &> /dev/null 加上命令echo $?判定是否成功执行。

重定向标准输入:
COMMAND < FILE.IN
cat < file1 > file2
将file1中的内容覆盖重定向至file2
cat < file1 >> file1
将file1的内容追加重定向至file1,如果不停止该命令会一直循环执行下去。(快速生成大文件)
多行输入重定向:

Here Document:<<EOF(此处EOF称为终止符End Of File即告诉程序内容输入完毕。)
LINE1
LINE2
...
EOF

tr命令:

功能:转换或删除字符的处理工具
格式:tr [OPTION]..SET1 [SET2]
把输入的数据当中的字符,凡是在SET1定义范围内出现的,通过对位转换为SET2出现的字符
选项:
-c -C --completment:取字符集的补集
-d --delete:删除所有属于SET1字符集中的字符
-s --squeeze-repeats:把所有连续重复的字符以单独一个字符表示
-t --trucate-set1:将SET1中的字符集对应转换为SET2中的字符集
用法1:
tr SET1 SET2 < /PATH/FROM/SOMEFILE
用法2:
tr -d SET1 < /PATH/FROM/SOMEFILE
注意:不修改原文件
a、替换字符:tr a-z A-Z </etc/issue
b、删除字符:tr -d 'abc' < /etc/issue

特殊字符集:
[:alnum:]:字母和数字
[:alpha:]: 大写和小写字母
[:upper:]:大写字母
[:lower:]: 小写字母
[:digit:]: 数字
[:punct:]:标点符号
[:graph:]: 图形字符
[:print:]:可打印字符
[:space:]:空白字符
[:cntrl:]: 控制(非打印)字符
[:xdigit:]:十六进制字符
写法:
tr 'a-z' 'A-Z'
将需处理文本中的小写字母转换为大写字母
tr 执行时,
如果字符个数SET1>SET2,则转换时SET2中最后一位字符作为SET1中最后几位无法一一对应字符的转换字符;
Linux中IO重定向和管道
如果字符个数SET1<=SET2,则转换时一一对应OK

管道

概念:使用管道命令可以将多个命令连接到一起,将 | 前面的命令的执行结果输出到 | 后面的命令,作为它的输入,可以实现多种工具组合以完成复杂任务
格式:COMMAND1 | COMMAND2 | COMMAND3 | ...
功能:将命令1的标准输出作为命令2的标准输入,命令2的标准输出作为命令3的标准输入
STDERR默认不能通过管道转发,但可以通过&>或2>&1实现
管道中最后一个命令会在当前shell进程的子shell进程中执行
pstree -p 查看
举例: ls | tr 'a-z' 'A-Z'
此命令将ls的输出结果发送给tr命令,从而实现将显示出的当前目录下的文件名由小写转为大写的功能
典型用法:echo "pwssword1" | passwd --stdin user1

重定向到多个目标

格式: COMMAND1 | tee [-a] FILE | COMMAND2
功能:将命令1的STDOUT输出到FILE中,并作为COMMAND2的输入
作用:
可同时查看和记录输出
保存不同阶段的输出
复杂管道的故障排除
多次管道输出,体现linux思想,组合小程序实现复杂功能
df -h|grep "\<[0-9].*" df.txt | tr -s " " ":"|cut -d: -f5|sort -un|tail -1
附加:某面试题:
以下四个哪个结果不一样
1 cmd &> file
2 cmd > file 2>&1

3 cmd 2>&1 > file xxx

4 cmd 2>file 1>&2