Linux命令行学习之路(六)——重定向和管道

今天我们来总结一下个人认为linux下最为实用和厉害的重定向和管道


在说今天的重点之前,必须要先学一点其他的新知识:标准输入(stdin)、标准输出(stdout)、标准错误输出(stderr)

标准输入(stdin):代码为0,使用<或<<   输入至程序的数据,但不是每个程序都需要输入

标准输出(stdout):代码为1,使用>或>>  程序运行中或者结束时输出的数据,默认是输出在终端上

标准错误输出(stderr):代码为2,使用2>或2>>    程序报错时输出的数据,默认是输出在终端上

关于这三个知识点现在有个概念就好,至于代码和使用的符号不用了解,本部分后面会进行总结


说到重定向不得不说的就是流,什么是流?

个人理解:当做字节,就是说没有确定的类型,将需要传输的东西按字节传输出去。

当然这个只是我个人的理解,大家自己可以百度一下。

不过没关系,流概念无法准确理解并不影响后面的学习,到目前位置我们所有的命令都是以流的形式输出到终端。

实质上,流的输出应该由三个方向:

1、终端

2、文件

3、其他命令

重定向其实就是将命令的输出流重新制定输出到哪儿,则如刚刚所讲,可以是终端,可以是文件,也可以是其他命令。

那么重定向是如何实现的呢?

重定向就是通过“>”和“>>”这两个符号实现的。结合刚刚我们总结的新知识,可以知道重定向是对标准输出和标准错误输出的重定向。

两个符号都可以表示重定向,那么这两个符号有什么区别吗?当然有了!

“>”:表示将前面命令的输出,以覆盖的方式输出到制定文件上,将覆盖指定文件内的内容(如果没有指定文件,则新建一个)

“>>”:表示将前面命令的输出,以累加的方式输出到指定文件上(如果没有指定文件,则新建一个)


那么最开始说的代号是什么意思呢??

默认情况下:

“<”和“<<”:表示标准输入,等价于“0<”和“0<<”

“>”和“>>”:表示标准输出,等价于“1>”和“1>>”

当需要将错误输出到指定文件时:使用“2>”或者“2>>”


废话不多说,我们直接开始举例吧,这样可以有助于我们更好的了解重定向

例1、ls /home > a.txt    表达的意思是:列出/home目录下的文件及目录,并输出到a.txt文件中(若a.txt本来有内容则覆盖),若当前目录下没有a.txt文件,则新建一个

例2、cat file.txt  >> a.txt  2>  errors.log   表达的意思是: 获取file.txt文件内容输出到a.txt文件末尾,将错误信息输出到errors.log文件内

例3、cat file.txt > a.txt  2>&1   表达的意思是: 获取file.txt文件内容输出到a.txt文件中,同时将错误信息也输出到a.txt中

例4、cat file.txt >> a.txt 2>&1  表达的意思是:获取file.txt文件内容输出到a.txt文件末尾,同时将错误信息也输出到a.txt中


当然还有一个更为简单的方法可以达到刚刚例3、4中的所达到的命令

输入:cat file.txt &>>a.txt  表达的意思是:获取file.txt文件内容和错误信息输出到a.txt文件末尾

如果想将正确和错误分别输出的话,输入:【命令】>>【正确输出的文件名】  2>>【错误输入的文件名】


通过上面的例子,各位读者有没有对重定向有了一定的了解了?


接下来我们说说标准输入:

“<”:从文件中读取数据

“<<”:从键盘读取数据

例1、cat < a.txt  实现的效果和 cat a.txt 没有任何区别,区别之处在于原理不同。

cat a.txt :cat命令打开文件,然后打印文件内容

cat < a.txt :cat命令只负责打印内容,打开文件并将a.txt内的内容交给cat命令的工作是终端完成

例2、sort -n << end   可以实现:输入之后将可以在终端进行输入数据(输入一个按一次回车),输入完毕之后,输入end即可结束输入,终端则将刚刚的数据排序并输出

例3、sort  -n << end > sortnumber.txt 2>&1  可以实现:将例2的输出输出到sortnumber.txt文件中(包括错误)


现在我们已经明白如何将输出输出到终端,文件了。那么命令是怎么回事?如何输入呢?

这个就涉及到我们这个部分的第二个重点:管道,符号为“|”

其意思是,将“|”符号之前的命令执行完后,作为符号后的命令的参数输入到命令中

是不是看不懂?为了帮助我们进一步了解管道命令,我们先来学习一个新的命令:cut   和一个新的文件格式.csv文件(逗号分隔值文件)

:不一定必须是逗号,也可以是其余的任何符号,如:!?。等

首先,我们说一下.csv文件,其中的内容用特定的符号进行分割,例如a.csv:

12,121/121,121

13,13/13,13

45,45/45,45

678,678/678,678


cut命令:对文件进行剪切

常用格式:

cut -c 【字符范围】【文件名】  例如: cut -c 2-4 a.txt   意思是:将a.txt文件中每行第二到第四字符的数据剪切出来,输出到终端

cut -d 【分隔字符】-f 【第几段】 【文件名】

例如:cut -d , -f 2 a.csv   假设a.csv内的内容如刚刚举例所说,剪切a.csv文件中以“,”号为分隔符分隔的第二段内容,则输出:

121/121

13/13

45/45

678/678


接下来我们就可以结合强大的管道命令,来实现一些较为复杂,在windows下需要很多操作的事情

例如:
cut -d , -f 1 a.csv | sort -n > sortnumber.txt

意思是:剪切a.csv中以“,”号为分隔符分隔的第一段内容,再按数字大小排序,输出大sortnumber.txt文件中,其结果为:

13

45

121

678


不得不说,这个部分的内容不仅灵活,而且多

不过如果学好了,我觉得对于文件的操作将会远超在windows下对文件的操作速度。


你可能感兴趣的:(linux,命令)