IO重定向和管道

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/ -- : (...)

猜你喜欢

转载自blog.csdn.net/qq_41201816/article/details/80682233