标准输入和输出
- 程序:指令+数据
读入数据:Input
输出数据:Output
打开的文件都有一个fd: file descriptor (文件描述符) - Linux给程序提供三种I/O设备
标准输入(STDIN)-0 默认接受来自键盘的输入
标准输出(STDOUT)-1 默认输出到终端窗口
标准错误(STDERR)-2 默认输出到终端窗口
I/O重定向:改变默认位置
-
把输出和错误重新定向到文件
- STDOUT和STDERR可以被重定向到文件
命令 操作符号 文件名
支持的操作符号包括: >
把STDOUT重定向到文件2>
把STDERR重定向到文件&>
把所有输出重定向到文件>
文件内容会被覆盖>>
原有内容基础上,追加内容
- 使用 > 将标准输出的内容指定到某个文件,不直接在屏幕上显示,但是指定的文件内容会被覆盖。
[root@CentOS7 ~]# hostname
CentOS7.localdomain
[root@CentOS7 ~]# hostname > /data/log
[root@CentOS7 ~]# cat /data/log
CentOS7.localdomain
- 使用 >> 将标准输出的内容指定到某个文件,不直接在屏幕上显示,原有内容不会被覆盖,追加指定内容。
- null 空设备,可以把所有不需要存放的信息存放进去。路径为 /dev/null
[root@CentOS7 ~]# hostname > /dev/null
- 使用 2>将标准输出重定向 ,且覆盖原文件。
使用>与2>结合,可以将错的和对的分别放入不同的文件里。
[root@CentOS7 ~]# ls /data/log >f1 2>f2
- 使用&>把所有输出重定向到文件,且覆盖原文件,&>>为追加内容。
- <的使用,事先将需要输出的命令写入文件里,然后输入的命令 < 文件名。即为标准输入的重定向
[root@CentOS7 ~]# bc < bc.log
18
5
注:bc为计算器,事先将3*6与2+3写入bc.log文件里。直接利用上述公式即可做到批量运算。
管道符
- 管道(使用符号“|”表示)用来连接命令
命令1 | 命令2 | 命令3 | … - 将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的STDIN
- STDERR默认不能通过管道转发,可利用2>&1 或 |& 实现
- 最后一个命令会在当前shell进程的子shell进程中执行用来
- 组合多种工具的功能
ls | tr ‘a-z’ ‘A-Z’
注:管道符只用处理标准输出,及左边命令必须为标准输出命令,错误命令不可使用
[root@CentOS7 ~]# echo 2*3
2*3
[root@CentOS7 ~]# echo 2*3 | bc
6
tr 命令
- tr 转换和删除字符
- tr [OPTION]… SET1 [SET2]
- 选项:
- -c –C --complement:取字符集的补集
- -d --delete:删除所有属于第一字符集的字符
- -s --squeeze-repeats:把连续重复的字符以单独一个字符表示
- -t --truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符
[root@CentOS7 ~]# who
lqx :0 2019-03-23 08:50 (:0)
lqx pts/0 2019-03-23 08:51 (:0)
root pts/1 2019-03-23 08:52 (192.168.152.1)
root pts/2 2019-03-23 13:57 (192.168.152.1)
[root@CentOS7 ~]# who | tr 'a-z' 'A-Z'
LQX :0 2019-03-23 08:50 (:0)
LQX PTS/0 2019-03-23 08:51 (:0)
ROOT PTS/1 2019-03-23 08:52 (192.168.152.1)
ROOT PTS/2 2019-03-23 13:57 (192.168.152.1)
bash: ty: command not found...
[root@CentOS7 ~]# who | tr 'a-z' 'A-Z'| tr -d '0-9'
LQX : -- : (:)
LQX PTS/ -- : (:)
ROOT PTS/ -- : (...)
ROOT PTS/ -- : (...)
单行与多行重定向
>
为单行重定向
[root@CentOS7 ~]# cat > f3.log
333
444
^C
[root@CentOS7 ~]# cat f3.log
333
444
<<
为多行重定向,命令的终止词必须与输入结果最后一行的终止词一致。
[root@CentOS7 ~]# cat >f4.log <<EOF
> ddd
> aaa
> EOF
[root@CentOS7 ~]# cat f4.log
ddd
aaa
注:EOF为end of file,经常被用来当多行重定向的标识符。
tee 重定向到多个目标
- 命令1 | tee [-a ] 文件名 | 命令2
把命令1的STDOUT保存在文件中,做为命令2的输入
tee -a ,不会覆盖文件内容。 - 使用:
- 保存不同阶段的输出
- 复杂管道的故障排除
- 同时查看和记录输出
[root@CentOS7 ~]# hostname | tee tee.lg
CentOS7.localdomain
[root@CentOS7 ~]# cat tee.lg
CentOS7.localdomain
[root@CentOS7 ~]# hostname | tee tee.lg | tr 'a-z' 'A-Z'
CENTOS7.LOCALDOMAIN