保持数据流动mysql
在前两节中,咱们看了一些能够为咱们操做数据的过滤器。在本节中,咱们将看到咱们如何将它们结合在一块儿来执行更强大的数据操做。ios
本节涉及一些阅读。即便这些机制及其使用很是简单,但若是您但愿有效使用这些机制,了解其行为的各类特征也很重要。sql
咱们在命令行上运行的每一个程序都会自动链接三个数据流。安全
管道和重定向是咱们能够将程序和文件之间的这些流链接起来,以有趣和有用的方式引导数据的手段。less
咱们将在下面用几个例子来演示管道和重定向,但这些机制能够在命令行上的每一个程序中使用,而不只仅是咱们在示例中使用的那些。ide
一般状况下,咱们会在屏幕上显示输出,这在大多数状况下都很方便,但有时咱们可能但愿将其保存到文件中做为记录,放入另外一个系统或发送给其余人。大于运算符(>)向命令行指示咱们但愿程序输出(或发送到STDOUT的任何内容)以保存在文件中而不是打印到屏幕上。咱们来看一个例子。ui
让咱们分解一下:this
您会注意到,在上面的示例中,保存在文件中的输出在打印到屏幕时每行只有一个文件,而不是一行。缘由是屏幕是已知的宽度,程序能够格式化它的输出以适应这种状况。当咱们重定向时,它多是一个文件,或者它可能在其余地方,因此最安全的选择是将其格式化为每行一个条目。这也可让咱们稍后更轻松地处理这些数据,由于咱们将在页面的下方看到。spa
当管道和重定向时,实际数据老是相同的,可是这些数据的格式可能与一般打印到屏幕上的数据稍有不一样。记住这一点。命令行
您还会注意到咱们建立的用于保存数据的文件也在咱们的列表中。机制的工做方式是首先建立文件(若是它不存在),而后程序运行并输出保存到文件中。
若是咱们重定向到一个不存在的文件,它会自动为咱们建立。可是,若是咱们保存到一个已经存在的文件中,那么它的内容将被清除,而后新的输出保存到它。
咱们可使用double大于运算符(>>)将新数据附加到文件中。
若是咱们使用小于运算符(<),那么咱们能够用另外一种方式发送数据。咱们将从文件中读取数据,并经过它的STDIN流将其传送到程序中。
许多程序(正如咱们在前面的章节中看到的)容许咱们提供一个文件做为命令行参数,它将读取和处理该文件的内容。鉴于此,您可能会问为何咱们须要使用此操做员。上面的例子说明了一个微妙但有用的区别。您会注意到,当咱们运行wc提供文件以做为命令行参数处理时,程序的输出中包含了已处理文件的名称。当咱们运行它时,将文件的内容重定向到wc文件名不被打印。这是由于不管什么时候咱们使用重定向或管道,数据都是匿名发送的。因此在上面的例子中,wc收到了一些要处理的内容,但它不知道它来自哪里,因此它可能不会打印这些信息。结果是,
咱们能够很容易地将咱们目前看到的两种形式的重定向合并为一个命令,以下面的示例所示。
如今咱们来看看第三个是标准错误仍是STDERR的流。这三个流实际上都有与它们相关的数字(在页面顶部的列表中的括号内)。STDERR是2号流,咱们可使用这些数字来识别流。若是咱们在>操做符以前放置一个数字,那么它会重定向该流(若是咱们不使用数字,就像咱们迄今为止所作的那样,那么它默认为流1)。
也许咱们但愿将正常输出和错误消息保存到一个文件中。这能够经过将STDERR流重定向到STDOUT流并将STDOUT重定向到文件来完成。咱们首先重定向到一个文件而后重定向错误流。咱们经过在流号码的前面放置一个&来识别流的重定向(不然它将重定向到名为1的文件)。
到目前为止,咱们已经处理向文件发送数据和从文件发送数据。如今咱们来看一下从一个程序发送数据到另外一个程序的机制。它被称为管道,咱们使用的操做符是(|)(位于大多数键盘上的反斜杠(\)键之上)。该操做员所作的是将左侧程序的输出做为右侧程序的输入。在下面的例子中,咱们将只列出目录中的前3个文件。
咱们能够按照咱们喜欢的方式将尽量多的节目一块儿制做 在下面的例子中,咱们而后将输出传送到尾部以便仅得到第三个文件。
咱们为程序提供的任何命令行参数都必须在该程序旁边。
我常常发现人们试图将他们的管道一鼓作气地写出来,并在某处沿线犯了一个错误。而后他们认为这是一个点,但实际上这是另外一点。他们浪费了大量的时间,试图解决不存在的问题,而没有看到存在的问题。若是你逐渐创建你的管道,那么你将不会陷入这个陷阱。运行第一个程序并确保它提供您指望的输出。而后添加第二个程序并再次检查,而后再添加第三个,依此类推。这会为你节省不少挫折。
你也能够组合管道和重定向。
如下是一些更多的例子,可让您了解您可使用管道进行的各类事情。有许多事情你能够用管道来实现,而这些只是其中的一小部分。凭借经验和一点创造性思惟,我相信你会发现更多的方式来使用管道让你的生活更轻松。
示例中使用的全部程序都是咱们之前见过的程序。然而,我已经使用了一些咱们还没有涉及的命令行参数。查看相关的手册页以了解他们的工做。你也能够本身尝试命令,逐步创建起来,看看每一个步骤都在作什么。
在这个例子中,咱们正在对目录列表进行排序,以便首先列出全部目录。
In this example we will feed the output of a program into the program less so that we can view it easier.
Identify all files in your home directory which the group has write permission for.
Create a listing of every user which owns a file in a given directory as well as how many files and directories they own.
让咱们修改一些数据: