流和输出重定向,心之所向
文章目录
流,管道,重定向,三管齐下
复习一下命令行基本用法
在终端输入命令(比如ls)
命令的运行结果就显示在终端
但是我们不知道其实我们可以重定向命令的运行结果
那么重定向是什么意思呢?
cut命令进阶
之前学习了cut命令,但是没有深入
只讲了基本的用法,(-c参数:根据字符数来剪切)
根据分隔符来剪切
CSV格式
CSV是Comma Separated Vlaues的缩写
意思是逗号分割值
CSV文件的后缀名为.csv,通常也可诶Excel等软件打开
打开之后会自动把分隔符隔开的值填充到表格里
那么我们创建一个csv文件的成绩单以用于cut命令的进阶学习使用
nano note.csv
可以看到我们每行按逗号分隔为三部分
学生名字
学生成绩
评语
假如我们要在note.csv文件中提取出学生名字这一列怎么办呢,我们不能用-c参数,因为名字的长短不一样
-d参数:d是delimiter的缩写,是英语 “分隔符”的意思
用于指定用什么分隔符(比如逗号、分号、双引号等等)
-f参数:f是field的缩写,是英语 “区域”的意思
表示剪切下分隔符分隔的哪一块或哪几块区域
cut -d , -f 1 note.csv
那么我们如果想要剪切出评语呢?
cut -d , -f 3 note.csv
那么想要名字,和评语部分呢
cut -d , -f 1,3 note.csv
那么如果要剪切成绩之后的所有出来呢
cut -d , -f 2- note.csv
这样第2部分之后的所有部分就都出来了
重定向
把本来要显示的在终端的命令结果,输送到别的地方
输送到文件中或者作为其他命令的输入(命令的链接,或者叫命令管道)
《哪里》:文件或者另一个命令的输入
《如何实现》:通过在命令键插入特定的符号
这些特殊的符号被称为“重定向流”符号
一个命令的输出有三个方向
重定向流在unix时代就已经时很重要的概念了
直到后来linux出现,重定向流的原理依然被沿用
重定向流将会改变我们看待终端命令行的方式
>和>>重定向到文件
最简单的操作就是把命令的输出结果重定向到文件中
就不会再终端显示命令的运行结果了
>:重定向到新文件
这里直切抛出问题:将上边剪切出来的名字和评语重定向到新文件
为了方便,我们在家目录新建一个目录
>可以将输出的结果重定向到你选择的文件中
cut -d , f 1,3 note.csv > studengs.txt
使用>符要小心
如果输出重定向的文件不存在,则会新建一个文件
如果此文件已经存在,则会覆盖掉存在的文件
而且不会征求用户确认的
黑洞文件 /dev/null
有时我们既不想将命令的输出显示在终端,也不想将其储存在文件中,那要怎么办呢?
Linux中有一个俗称黑洞的文件,/dev/null
这个文件的详细信息是这样的
null我们知道是英语 无 空 的意思
/dev/null文件是特殊文件,不是一个目录
这个文件具有唯一的属性:它总是空的
它能使发送到/dev/null的任何文件作废
就想这些数据掉进了无底的黑洞一样
演示一下,既不输出在终端,也不输出在文件,把数据丢在黑洞
cut -d , -f 1,3 note.csv > /dev/null
>>:重定向到文件末尾
的作用与>类似,不过它不想>那么危险
它是将重定向的内容写在文件末尾,起到追加的作用
如果文件不存在,也会被创建
cut -d , -f 1- note.csv >> students.txt
小结
>:重定向到文件Zhong
如果文件存在则覆盖文件,如果文件不存在则创建文件
>>: 重定向到文件末尾
如果文件存在则追加内容到文件末尾,如果不存在则创建文件
新的几种符号
2>,2>>,2>&1 重定向错误输出
stdin,stdout,stderr
从键盘向终端输入数据,这是标准输入,也就是stdin
这时候终端如果接收键盘的输入的命令,就会产生两种输出
第一种:标准输出,stdout,指终端输出的信息(不包括错误的信息),这个就是我们一直看到的linux命令的正常运行结果,例如我们输入ls,如下图返回的文件就是stdout,我们的标准输出
第二种:标准错误输出,stderr,指终端输出的错误信息
正常:
异常:
假如这个目录中没有note.csv这个文件,打印No suchh file or directory找不到这个文件或目录,这就是我们的标准错误输出
看图理解
我们的终端向程序发送指令stdin,程序会返回两种输出,一种标准输出stdout,一种标准异常输出stderr,他们三个,我们就可以理解为流
流
在计算机科学中,流(stream)的含义是比较难理解的
也比较丰富,不同情况下的含义也不太一样
如果比作水流可能不完全
基维百科这样对 流 进行解释
在计算机科学中,流是时间上可用的一系列数据元素,我们可以把流比喻成传送带上的物件,每个时间点传输一个,而不是多个打包传输
stdin:标准输入流
英语 standard input 的缩写(standard input是英语标准的意思,input是输入的意思)。标准输入是指输入至程序的数据(通常是文件)。程序要求以读(read)操作来传输数据。并非所有程序都要求输出。如ls命令运行时不用任何输入。除非重定向,输入是预期都是有键盘获取的。标准的输入文件描述符为0(零)。
stdout:标准输出流
标准输出是指程序输出的数据。程序要求数据传输使用写的运算。并非所有程序都需要输出。如mv命令在成功完成时是没有输出的。除非重定向,输出都是预期显示在终端上的。标准输出的文件描述符为1(一)。
stderr:标准错误输出流
标准错误输出流是另一种输出流,用于输出的错误消息或诊断。它独立于标准输出,并且标准输出和标准错误输出可以被分别重定向。标准错误输出的文件描述符为2(二)。
那就普及一下什么是文件描述符
文件描述符
文件描述符的英语是 File Descriptor ,简称fd
文件描述符是一个用于表述指向文件的引用的抽象化概念
文件描述符在形式上是一个非负整数。实际上 它是一个索引值,指向程序操作系统内核为每一个进程所维护的该该进程打开文件的记录表。当程序打开一个现有文件或创建一个新文件时,内核向文件返回一个文件描述符
文件描述符通常是Linux,Unix等系统的概念
在windows中也有相对概念,称为 句柄 ,就是 handle
直接抛问题,怎么讲标准输出流和标准错误输出流同时重定向到两个文件中呢?
cat note.csv 1>result.log 2>error.log
标准流输入到result.log
标准错误输入到error.log
还有一种特殊的,就是将标准输出流和标准错误输出流重定向到相同位置
ccat note.csv > results.txt 2>&1
小结
2> :将标准错误输出重定向到文件
如果文件已经存在则覆盖文件
如果文件不存在则创建文件
2>>:将标准错误输出重定向到文件末尾
2>&1:将标准输出和标准错误输出重定向到同一个地方
Linux命令的结果(标准输出),我们不一定要显示在终端中
也可以存放在其一个文件中
只要在命令后加上 > 符号,然后接文件名就可以了
例如: ls > file_lsit.txt 就会把ls命令的结果,也就是当前目录所有存放列表存放到file_list.txt 这个文件中
重定向追加:>>可以追加内容
重定向清空:>会把文件内容清空,在写入
如果文件已经存在,那么>>符号会在文件末尾追加写入内容
2>和2>>符号用于重定向标准错误输出到文件中
2>&1符号用于将标准输出和标准错误输出重定向到相同地方
管道
把两个命令连起来用,一个命令的输出作为另一个命令的输入
这就构成了管道pipeline
可以想象成一个个水管,链接起来
这个水管的水输出,接上另一个水管输入,就成为另一个水管的输入