Linux 给程序提供三种I/O设备:
STDOUT和STDERR 可以被重定向到文件,支持的操作符号包括:
> 把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把所有输出重定向到文件


标准输出和错误输出各自重定向至不同位置
COMMAND > /PATH/TO/FILE.OUT 2> /PATH/TO/ERRORFILE.OUT
- COMMAND > /path/to/file.out 2> &1 (顺序很重要)
-
- COMMAND >> /path/to/file.out 2>> &1
find /etc -name passwd 2> /dev/null
():合并多个程序的STDOUT ( cal 2007 ; cal 2008 ) > all.txt
ls /etc >> /tmp/out.txt 2>&1
使用<来重定向标准输入
某些命令能够接受从文件中导入的STDIN:
tr 'a-z' 'A-Z' < /etc/issue //该命令将issue文件中的小写字母全部转换为大写

tr –d abc < /etc/fstab 删除fstab文件中的所有abc中任意字符

文档终止词 <<
使用 << 命令从键盘把多行重导向给STDIN,直到 终止词 位置的所有文本都发给STDIN

tr [a-z] [A-Z] < /etc/issue 把/etc/issue中的所有字符转化为大写并输出到屏幕上

- tr -d '[A-Z]' < /etc/issue 把/etc/issue 中的大写字母移除
- Here Document: <<
- cat << EOF
- cat > /tmp/out.txt <<EOF
命令参数
-c或——complerment:取字符集的补集
-d或——delete:删除所有属于第一字符集的字符
-s或—squeeze-repeats:把连续重复的字符以单独一个字符 表示
-t或--truncate-set1:将第一个字符集对应字符转化为第二 字符集对应的字符
STDERR默认不能通过管道转发,可利用2>&1 或 |& 实现


tee命令:
命令1 | tee 文件名 | 命令2
把命令1的STDOUT保存在文件名中,然后管道输入给命令2
使用:
保存不同阶段的输出
复杂管道的故障排除
同时查看和记录输出
因此可以定向到多个目标,比如要在屏幕显示,又要保存到磁盘,那么
[root@localhost etc]# ls /etc/ | tee /tmp/out.txt | tr 'a-z' 'A-Z'

将command结果输出到屏幕上,又保存了一份在磁盘上,由于tr名字在最后执行,因此结果如下

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

4、将/root/下文件列表,显示成一行,并文件名之间用空格隔开
ls /root/ | tr '\n' ' '
5、file1文件的内容为:”1 2 3 4 5 6 7 8 9 10” 计算出所有数字的总和
cat file1 | tr ' ' '+' | bc
6、删除Windows文本文件中的'^M'字符
tr -d '\r' < 1.txt | tee 2.txt
7、处理字符串“xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4”,只保留其中的数字和空格
echo $"xt.,l 1 jr#-limn2 c*/fe3 uz4" | tr -d [:alpha:],[:punct:]
8、将PATH变量每个目录显示在独立的一行
echo $PATH | tr ':' '\n
9、删除指定文件的空行
cat lss | tr -s '\n'
10、将文件中每个单词(字母)显示在独立的一行,并无空行
cat lss |tr ' ' '\n'| tr -s '\n'