今天我们来总结一下个人认为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下对文件的操作速度。