一,标准输入输出:
程序 : 指令+数据
程序 :IO
可用于输入的设备:文件,键盘设备,文件系统上的常规文件,网卡等;
可用于输出的设备:文件,显示器,文件系统上的常规文件,网卡等,
程序的数据流有三种:
输入的数据流:<-- 标准输入(stdin),键盘
输出的数据流: -->标准输出(stdout),显示器
错误输出流: -->错误输出(stderr), 显示器
fd:file descriptor 文件描述符
Linux 给程序提供三种I/O设备:
标准输入(STDIN):0 默认接受来自键盘的输入
标准输出(STDOUT):1 默认输出到终端窗口
错误输出(STDERR):2 默认输出到终端窗口
IO重定向:改变默认位置
STDOUT和STDERR 可以被重定向到文件,支持的操作符号包括:
> 把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把所有输出重定向到文件
输出重定向:>
特性:覆盖输出!(很危险)
特殊设备: /dev/null ##任何数据放到里面都会丢弃
# set -C (仅对当前shell有效)
禁止覆盖输出已存在的对象
ls /etc > /tmp/out.txt #强制覆盖输出 >|
# set +C
关闭上述特性
ls /etc > /tmp/out.txt
ls /etc > /dev/sda //可能会干掉你的硬盘数据
输出重定向:>>
特性:追加输出!
错误输出流
2> : 覆盖重定向错误输出数据流
2>> : 追加重定向错误输出数据流
标准输出和错误输出各自重定向至不同位置
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命令:
tr[OPTION]... SET1 [SET2]:把输入的数据当成字符,把set1的字符对位转换set2的字符
### 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 或 |& 实现
![1469846020498194.png blob.png](http://liuyuworld.com/ueditor/php/upload/image/20160730/1469846020498194.png)
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'