Linux教程 - 管道和重定向

 

管道和重定向!

保持数据流动mysql

介绍

 

在前两节中,咱们看了一些能够为咱们操做数据的过滤器。在本节中,咱们将看到咱们如何将它们结合在一块儿来执行更强大的数据操做。ios

本节涉及一些阅读。即便这些机制及其使用很是简单,但若是您但愿有效使用这些机制,了解其行为的各类特征也很重要。sql

那么他们是什么?

咱们在命令行上运行的每一个程序都会自动链接三个数据流。安全

  • STDIN(0) - 标准输入(数据输入到程序中)
  • STDOUT(1) - 标准输出(由程序打印的数据,默认为终端)
  • STDERR(2) - 标准错误(对于错误消息,也默认为终端)

节目流

管道和重定向是咱们能够将程序和文件之间的这些流链接起来,以有趣和有用的方式引导数据的手段。less

咱们将在下面用几个例子来演示管道和重定向,但这些机制能够在命令行上的每一个程序中使用,而不只仅是咱们在示例中使用的那些。ide

重定向到一个文件

一般状况下,咱们会在屏幕上显示输出,这在大多数状况下都很方便,但有时咱们可能但愿将其保存到文件中做为记录,放入另外一个系统或发送给其余人。大于运算符(>)向命令行指示咱们但愿程序输出(或发送到STDOUT的任何内容)以保存在文件中而不是打印到屏幕上。咱们来看一个例子。ui

  1. LS
  2. barry.txt bob example.png firstfile foo1 video.mpeg
  3. ls> myoutput
  4. LS
  5. barry.txt bob example.png firstfile foo1 myoutput video.mpeg
  6. 猫myoutput
  7. barry.txt
  8. 短发
  9. example.png
  10. firstfile
  11. foo1
  12. MyOutput中
  13. video.mpeg

让咱们分解一下:this

  • 第1行让咱们先看看当前目录中的内容。
  • 第3行如今咱们将运行相同的命令,可是此次咱们使用>来告诉终端将输出保存到文件myoutput中。你会注意到咱们不须要在保存以前建立文件。若是终端不存在,终端将自动建立它。
  • 第4行如您所见,咱们的新文件已建立。
  • 第6行让咱们来看看在那里保存了什么。

一些观察

您会注意到,在上面的示例中,保存在文件中的输出在打印到屏幕时每行只有一个文件,而不是一行。缘由是屏幕是已知的宽度,程序能够格式化它的输出以适应这种状况。当咱们重定向时,它多是一个文件,或者它可能在其余地方,因此最安全的选择是将其格式化为每行一个条目。这也可让咱们稍后更轻松地处理这些数据,由于咱们将在页面的下方看到。spa

当管道和重定向时,实际数据老是相同的,可是这些数据的格式可能与一般打印到屏幕上的数据稍有不一样。记住这一点。命令行

您还会注意到咱们建立的用于保存数据的文件也在咱们的列表中。机制的工做方式是首先建立文件(若是它不存在),而后程序运行并输出保存到文件中。

保存到现有文件

若是咱们重定向到一个不存在的文件,它会自动为咱们建立。可是,若是咱们保存到一个已经存在的文件中,那么它的内容将被清除,而后新的输出保存到它。

  1. 猫myoutput
  2. barry.txt
  3. 短发
  4. example.png
  5. firstfile
  6. foo1
  7. MyOutput中
  8. video.mpeg
  9. wc -l barry.txt> myoutput
  10. 猫myoutput
  11. 7 barry.txt

咱们可使用double大于运算符(>>)将新数据附加到文件中。

  1. 猫myoutput
  2. 7 barry.txt
  3. ls >> myoutput
  4. 猫myoutput
  5. 7 barry.txt
  6. barry.txt
  7. 短发
  8. example.png
  9. firstfile
  10. foo1
  11. MyOutput中
  12. video.mpeg

从文件重定向

若是咱们使用小于运算符(<),那么咱们能够用另外一种方式发送数据。咱们将从文件中读取数据,并经过它的STDIN流将其传送到程序中。

  1. wc -l myoutput
  2. 8 myoutput
  3. wc -l <​​myoutput
  4. 8

许多程序(正如咱们在前面的章节中看到的)容许咱们提供一个文件做为命令行参数,它将读取和处理该文件的内容。鉴于此,您可能会问为何咱们须要使用此操做员。上面的例子说明了一个微妙但有用的区别。您会注意到,当咱们运行wc提供文件以做为命令行参数处理时,程序的输出中包含了已处理文件的名称。当咱们运行它时,将文件的内容重定向到wc文件名不被打印。这是由于不管什么时候咱们使用重定向或管道,数据都是匿名发送的。因此在上面的例子中,wc收到了一些要处理的内容,但它不知道它来自哪里,因此它可能不会打印这些信息。结果是,

咱们能够很容易地将咱们目前看到的两种形式的重定向合并为一个命令,以下面的示例所示。

  1. wc -l <​​barry.txt> myoutput
  2. 猫myoutput
  3. 7

重定向STDERR

如今咱们来看看第三个是标准错误仍是STDERR的流。这三个流实际上都有与它们相关的数字(在页面顶部的列表中的括号内)。STDERR是2号流,咱们可使用这些数字来识别流。若是咱们在>操做符以前放置一个数字,那么它会重定向该流(若是咱们不使用数字,就像咱们迄今为止所作的那样,那么它默认为流1)。

  1. ls -l video.mpg blah.foo
  2. ls:没法访问blah.foo:没有这样的文件或目录
  3. -rwxr - r-- 1 ryan用户6 5月16日09:14 video.mpg
  4. ls -l video.mpg blah.foo 2> errors.txt
  5. -rwxr - r-- 1 ryan用户6 5月16日09:14 video.mpg
  6. cat errors.txt
  7. ls:没法访问blah.foo:没有这样的文件或目录

也许咱们但愿将正常输出和错误消息保存到一个文件中。这能够经过将STDERR流重定向到STDOUT流并将STDOUT重定向到文件来完成。咱们首先重定向到一个文件而后重定向错误流。咱们经过在流号码的前面放置一个&来识别流的重定向(不然它将重定向到名为1的文件)。

  1. ls -l video.mpg blah.foo> myoutput 2>&1
  2. 猫myoutput
  3. ls:没法访问blah.foo:没有这样的文件或目录
  4. -rwxr - r-- 1 ryan用户6 5月16日09:14 video.mpg
 

管道

到目前为止,咱们已经处理向文件发送数据和从文件发送数据。如今咱们来看一下从一个程序发送数据到另外一个程序的机制。它被称为管道,咱们使用的操做符是(|)(位于大多数键盘上的反斜杠(\)键之上)。该操做员所作的是将左侧程序的输出做为右侧程序的输入。在下面的例子中,咱们将只列出目录中的前3个文件。

  1. LS
  2. barry.txt bob example.png firstfile foo1 myoutput video.mpeg
  3. ls | 头-3
  4. barry.txt
  5. 短发
  6. example.png

咱们能够按照咱们喜欢的方式将尽量多的节目一块儿制做 在下面的例子中,咱们而后将输出传送到尾部以便仅得到第三个文件。

  1. ls | 头-3 | 尾巴-1
  2. example.png

咱们为程序提供的任何命令行参数都必须在该程序旁边。

我常常发现人们试图将他们的管道一鼓作气地写出来,并在某处沿线犯了一个错误。而后他们认为这是一个点,但实际上这是另外一点。他们浪费了大量的时间,试图解决不存在的问题,而没有看到存在的问题。若是你逐渐创建你的管道,那么你将不会陷入这个陷阱。运行第一个程序并确保它提供您指望的输出。而后添加第二个程序并再次检查,而后再添加第三个,依此类推。这会为你节省不少挫折。

你也能够组合管道和重定向。

  1. ls | 头-3 | tail -1> myoutput
  2. 猫myoutput
  3. example.png

更多示例

如下是一些更多的例子,可让您了解您可使用管道进行的各类事情。有许多事情你能够用管道来实现,而这些只是其中的一小部分。凭借经验和一点创造性思惟,我相信你会发现更多的方式来使用管道让你的生活更轻松。

示例中使用的全部程序都是咱们之前见过的程序。然而,我已经使用了一些咱们还没有涉及的命令行参数。查看相关的手册页以了解他们的工做。你也能够本身尝试命令,逐步创建起来,看看每一个步骤都在作什么。

在这个例子中,咱们正在对目录列表进行排序,以便首先列出全部目录。

  1. ls -l / etc | tail -n +2 | 分类
  2. drwxrwxr-x 3 nagios nagcmd 4096 Mar 29 08:52 nagios
  3. drwxr-x--- 2 news news 4096 Jan 27 02:22 news
  4. drwxr-x--- 2 root mysql 4096 Mar 6 22:39 mysql
  5. ...

In this example we will feed the output of a program into the program less so that we can view it easier.

  1. ls -l /etc | less
  2. (Full screen of output you may scroll. Try it yourself to see.)

Identify all files in your home directory which the group has write permission for.

  1. ls -l ~ | grep '^.....w'
  2. drwxrwxr-x 3 ryan users 4096 Jan 21 04:12 dropbox

Create a listing of every user which owns a file in a given directory as well as how many files and directories they own.

  1. ls -l /projects/ghosttrail | tail -n +2 | sed 's/\s\s*/ /g' | cut -d ' ' -f 3 | sort | uniq -c
  2. 8 anne
  3. 34 harry
  4. 37 tina
  5. 18 ryan

Summary

>
Save output to a file.
>>
Append output to a file.
<
Read input from a file.
2>
Redirect error messages.
|
将一个程序的输出做为输入发送到另外一个程序。
您能够在命令行上运行的每一个程序都有3个流,STDIN,STDOUT和STDERR。
 

活动

让咱们修改一些数据:

  • 首先,尝试将各类命令的输出保存到文件中。覆盖该文件并追加到它。确保你正在使用绝对路径和相对路径。
  • 如今看看你是否只能列出目录/ etc中最后20个文件。
  • 最后,看看您是否能够计算在主目录中有多少文件和目录具备执行权限。
相关文章
相关标签/搜索