IO重定向是什么?我其实不太清楚,只知道他是把输入和输出输出和输入到自己想要的地方。
然后我上网看了一些文章,有点明白了。首先我们要弄明白这几个问题:
什么叫IO重定向?
要明白这个问题,我们要先明白什么叫IO,什么叫做程序的数据流。
什么叫IO?
在Linux或计算机领域IO指的是信息的输入和输出。
在Linux中可用于输入的设备:文件(Linux中一切皆文件)
具体包括:键盘设备、文件系统上的常规文件、网卡等。
在Linux中用于输出的设备:文件
具体包括:显示器、文件系统上的常规文件、网卡等。
什么叫做数据流?
一组有序,有起点和终点的字节的数据序列。包括输出流,输入流。因为数据一般是流动的,动态的。
所以,IO重定向,我认为是把在这个动态过程捕抓到的数据输出到某自己想要的地方。将系统原本默认的输入输出的路径重新定向到其他文件
因为Linux里面,一切都是文件,设备都是以文件方式存放。
所以:
可以用来输入的设备: 文件
键盘设备,文件系统上的常规文件,网卡;
用以用来输出的设备:文件
显示器,文件系统上的常规文件,网卡;
程序的数据流有三种:
输入的数据流:<--标准的输入:键盘
输出的数据流:-->标准输出:显示器(终端)
错误输出流:-->错误输出:显示器(终端)
文件描述符:fd
在Linux中打开一个文件,在该文件被加载完成后对于系统来说需要用一个数字表示,这个数字叫做fd:file descriptor 。
因为Linux系统中一切皆文件,所以对应的标准输入设备,标准输出设备,错误输出设备都有其对应的fd
标准输入:0
标准输出:1
错误输出:2
输出重定向
其常用 >、 >> 、>|这三种表示
>:覆盖输出 >>:追加输出 >|:强行覆盖
因为使用>不当会对原有的数据造成很大的影响,会覆盖掉原有数据,所以有时候我们会手动设定关闭>的特性。
命令为:
set -C禁止覆盖输出重定功能
set +C为开启覆盖输出重定向功能
练习:
[root@localhost mulu]# ll
总用量 0
-rw-r--r--. 1 nick nick 0 4月 22 11:52 a
[root@localhost mulu]# ll > ./a
[root@localhost mulu]# ll
总用量 4
-rw-r--r--. 1 nick nick 55 4月 25 08:50 a
[root@localhost mulu]# cat a
总用量 0
-rw-r--r--. 1 nick nick 0 4月 25 08:50 a
>的自动覆盖特性
[root@localhost mulu]# echo "123456" > ./a
[root@localhost mulu]# cat a
123456
>>的追加特性
[root@localhost mulu]# echo "hallo" >> ./a
[root@localhost mulu]# cat a
123456
hallo
set -C 与set +C
root@localhost mulu]# echo "123" > ./a
-bash: ./a: 无法覆盖已存在的文件
[root@localhost mulu]# set +C
[root@localhost mulu]# echo "123" > ./a
[root@localhost mulu]# cat a
123
|>的强制覆盖特性
[root@localhost mulu]# cat a
123
[root@localhost mulu]# set -C
[root@localhost mulu]# echo "fdadfaf123" >| ./a
[root@localhost mulu]# cat a
fdadfaf123
错误输出重定向: 2>,2>>
[root@localhost mulu]# echoo 1 > a2
-bash: echoo: 未找到命令
当命令出错的时候,系统会弹出错误消息,但我们想把它重定向到别的地方,可以用错误输出重定向
[root@localhost mulu]# echoo 1 2> a2
-bash: a2: 无法覆盖已存在的文件 // 因为我们之前用了set -C
[root@localhost mulu]# set +C
[root@localhost mulu]# echoo 1 2>a2
[root@localhost mulu]# ll
总用量 4
-rw-r--r--. 1 nick nick 11 4月 25 08:56 a
-rw-r--r--. 1 root root 0 4月 25 08:58 a2
[root@localhost mulu]# echoo 1 2>t3
[root@localhost mulu]# echoo 1 2>a3
[root@localhost mulu]# cat a3
-bash: echoo: 未找到命令
[root@localhost mulu]# echow wqwe 2>>a3
[root@localhost mulu]# cat a3
-bash: echoo: 未找到命令
-bash: echow: 未找到命令
错误重定向和上面的标准输出重定向一样,也支持追加。
如果我们不管命令对错都想记录那么可以使用如下格式实现:
1、&>、 &>>
[root@localhost mulu]# ech2 &>>a4
[root@localhost mulu]# echo abc &>>a4
[root@localhost mulu]# cat a4
-bash: ech2: 未找到命令
abc
2、command >> /path/file ... 2>&1 第二种只能为此种格式,不管前面是追加还是覆盖后面均为2>&1。2>>&1为错误格式,使用后在CentOS7.2下会报错。
[root@localhost mulu]# ech2 >> a5 2>&1
[root@localhost mulu]# echo good >>a5 2>&1
[root@localhost mulu]# cat a5
-bash: ech2: 未找到命令
good
重定向的内容会输出到最后一个重定向的目标去
[root@localhost mulu]# who >a4>a
[root@localhost mulu]# cat a4
[root@localhost mulu]# cat a
root pts/0 2018-04-25 08:40 (192.168.50.1)
[root@localhost mulu]# who >>a>a4
[root@localhost mulu]# cat a4
root pts/0 2018-04-25 08:40 (192.168.50.1)
[root@localhost mulu]# cat a
root pts/0 2018-04-25 08:40 (192.168.50.1)
管道:连接程序,实现将前一个命令的输出直接定向后一个程序当做输入数据流。
其常用表达格式如下: COMMAND1 | COMMAND2 | COMMAND3 |...
输入重定向: <
tr
tr [OPTION]... SET1 [SET2]
把输入的数据中的字符,凡是SET1定义范围内出现的,全部对位转换为SET2出现的字符
用法1:
tr xxx XXX < /path/to/somefile // 把xxx转换成XXX
用法2:
tr -d XXX < /path/to/somefile // 删除XXX
[root@localhost mulu]# cat a6
ROOT PTS/0 2018-04-25 08:40 (192.168.50.1)
root pts/ -- : (...)
[root@localhost mulu]# tr a-z A-Z <./a6
ROOT PTS/0 2018-04-25 08:40 (192.168.50.1)
ROOT PTS/ -- : (...)
tr 把某些字符转换成自己想要的字符
[root@localhost mulu]# who | tr a-z A-Z >a6
[root@localhost mulu]# cat a6
ROOT PTS/0 2018-04-25 08:40 (192.168.50.1)
tr -d 删除指定的内容
[root@localhost mulu]# who | tr -d "0-9" >>a6
[root@localhost mulu]# cat a6
ROOT PTS/0 2018-04-25 08:40 (192.168.50.1)
root pts/ -- : (...)