Linux输入输出重定向以及管道(上)

Linux输入输出重定向以及管道(上)

0X00 前言

重定向,管道,想必大家都不太陌生,但是要很有条理的说个明白,似乎又有点困难。有点话在嘴边又说不出的感觉。
今天在网上查了一下,发现网上资料还是挺乱的。所以今天打算总结一下挂出来,希望大家多多支持~
ps:为了说明白可能会用到一些Linux指令,我会做简要说明,可能会不太清楚,如有不懂的地方可以去其他地方查查资料。废话不多说,直接开始!

0X10 输出重定向

1、 ‘>’ 重定向符

我们知道,在Linux终端输入某些命令的时候,得到的结果会输出在屏幕上。
比如我们熟悉的 cat 指令,将文件中的内容输出到屏幕上:

cat notes.csv

此时屏幕上将显示文件里的内容:
在这里插入图片描述
那么问题来了,如果我不想将信息显示在屏幕上呢?而是想存入文件里呢?
答案很简单,使用 重定向符—— ‘>

cat notes.csv > new_notes.csv

完了?完了!就一个符号,搞定!我们看看执行效果:
在这里插入图片描述
有的人要问了,这感觉啥事都有没有啊。的确,因为本应该打印的屏幕上的被重定向到new_notes.csv里面去了。我们现在再看看new_notes.csv的内容
在这里插入图片描述
对头,全进来了!
总结一下 ‘>’ 的用法:

  • 如果要重定向到的文件(new_notes.csv)不存在,会创建一个文件

  • 如果该文件存在,那么会直接覆盖文件中的内容

    所以,大家一定要小心,不然很容易会悔断肠的!
    那又有人问了,这也太糟心了,要是我不想覆盖其中的内容可咋办。
    这还真问到点上了,Linux的设计者早就想到了。

2、 “>>” 重定向符

为了解决上面的问题,只要使用 “>>” 重定向符就好了,它功能和 '>'一样,只是有一点:
输出流会重定向文件的末尾,而不是覆盖所有的内容

让我们运行 cat 命令两次,并采用 >> 重定向:

cat notes.csv >> new_notes.csv
cat notes.csv >> new_notes.csv

我们再看看new_notes.csv中的内容
在这里插入图片描述
两次cat的结果都重定向到了new_notes.csv里。因此 >> 是的内容是接到文件尾部的。

到了这里,可能还是有人有疑问,感觉这没啥用啊,就像这 cat 指令,它本来就是把信息输入到屏幕上的,你又弄到文件里那岂不是弄巧成拙咯

扫描二维码关注公众号,回复: 12200303 查看本文章

好的,我们来整个硬核的!

3、 一个硬核的例子

我们来认识一个指令:cut
顾名思义,就是将文件中的某些信息剪切出来并且输出到屏幕
先来看看以下两个参数:

  • -d 根据某一符号(逗号、分号、双引号等)来划分区域

  • -f 取区域,根据符号划分的区域

    就拿上面的notes.csv文件来举例子
    执行以下指令:

cut -d , -f 1 notes.csv

解释一下,按 ‘,’ 来划分区域,取第一个区域(即第一列)
结果:
在这里插入图片描述
是不是有点神奇
那这还是显示在屏幕上,这样的信息提取出来还是没有,只有存储下来才能有用。这时候重定向符 ‘>’ ‘>>’ 号的作用就显示出来了。
我们先码几条指令:

cut -d , -f 1,3 notes.cvs >> news_notes.csv
cut -d , -f 1-3 notes.cvs >> news_notes.csv
cut -d , -f 2- notes.cvs >> news_notes.csv
这三条指令,前面的不用说,按 ',' 来划分区域,后面的意思分别为:

取1,3列
取1到3列
取2到最后一列

再去看news_notes.csv文件:
在这里插入图片描述
三部分分别对应三条指令,这样想取的信息就cut出来并存储了。是不是:
在这里插入图片描述
再唠叨一句,如果我既不想输出到屏幕,又不想输出到文件又怎么办?
(要求还真多啊)记住,这是Linux!只有你想不到,没有它做不到!(有点夸张哈)
Linux中有一个俗称“黑洞”的文件,就是

/dev/null

/dev/null 文件是特殊文件,不是一个目录,此文件具有唯一的属性:它总是空的。它能使发送到 /dev/null 的任何数据作废,就好像这些数据掉进了无底的黑洞一般。

因此,假如我们不需要在终端显示刚才那个 cut 命令的结果,也不想存储到文件里,那么可以这么做:

cut -d , -f 1 notes.csv > /dev/null

然后,就没有然后了23333
发个图:
在这里插入图片描述

0X20 “2>,2>>,2>&1”:重定向错误输出

1、stdin,stdout,stderr :标准输入,标准输出,标准错误输出

我们首先需要认识这几个名词:标准输入,标准输出,标准错误输出
其实并不难:

标准输入:stdin,从键盘向终端输入数据
标准输出:stdout。指终端输出的信息(不包括错误信息)
标准错误输出:stderr。指终端输出的错误信息

标准输入就不用说了,标准输出就是我们之前cat显示的那些种种,那么标准错误输出呢?
比如我们输入:

cat tmp.csv

就会出现以下信息:
在这里插入图片描述
显示没有这个文件,这就是 标准错误输出
不多说啦,直接挂图
在这里插入图片描述
但我们要讨论的问题是:’>‘ 和 “>>” 能作用于标准错误信息吗?
让我们来尝试一下:

cat tmp.csv > new.txt

结果:
在这里插入图片描述
发现屏幕显示了错误信息,再查看一下 new.txt 发现是空的。所以没有将错误信息重定向到new.txt中,因此:
’>’ 和 “>>” 无法重定向错误信息

2、2>,2>> 的使用

所以为了满足广大Linuxer的要求,设计者还设计了 标准错误信息 的重定向符号。
我们先来看如下表格:

文件描述符 名字 解释
0 stdin 标准输入
1 stdout 标准输出
2 stderr 标准错误输出

什么是文件描述符就不详细说了,我们现在知道 2代表 标准错误输出 就好了

现在来看怎么表示着 标准错误信息 的重定向符号
说出来你可能不信,直接在 标准重定向符号 前面加个 2 就好了

2>
2>>

我们现在再改一下刚才的指令:

cat tmp.csv 2> new.txt

看结果:
在这里插入图片描述
此时 前面的重定向已经没有错了,而是错误信息已经写入 new.txt 文件了
同理 2>> 也是一样的,不过它是讲信息添在文件没末尾,这就不赘述了

3、2>&1的使用

到现在,可能又有人要说了,要是我想把标准输出和标准错误输出都重定向到同一个地方。怎么做呢?
(太任性了)
在这里插入图片描述
上指令!

cat not_exist_file.csv > results.txt 2>&1

上面的命令的作用是:将 cat not_exist_file.csv 这个命令的所有输出(标准输出和标准错误输出)都重定向到 results.txt 文件中
因为 not_exist_file.csv 这个文件不存在,但因为加了 2>&1 这个符号,所以标准输出(为空)和标准错误输出(cat: not_exist_file.csv: No such file or directory)都重定向到 results.txt 文件中了
在这里插入图片描述
这可能看不出很多,但是有时候在只是某些命令的时候,会有标准输出又会有错误输出,比如再find文件时,出现权限不够的情况

那么问题又来了:如果不想覆盖,而是接在文件末尾呢?难道是 2>>&1
错! 2>&1不能改
要改的是前面
将信息存储到文件末尾

cat not_exist_file.csv >> results.txt 2>&1
最后上图:

在这里插入图片描述 这里没有加 >> 和 2>>,不然这图就太复杂了

0X30 未完待续…

今天写的太累了,还是明天在写吧,嘿嘿嘿
下次讲 输入重定向 和 管道
在这里插入图片描述

下篇也完成啦,挂在这里,希望大家多多支持:
Linux输入输出重定向以及管道(下)
——————————————————————————————————————————————————————————
参考:Linux命令行与Shell脚本编程大全/23 流和输出重定向,心之所向

猜你喜欢

转载自blog.csdn.net/rjszz1314/article/details/104417444
今日推荐