06-1重定向

作者: 見贤思齊_ | 来源:发表于2020-07-21 21:51 被阅读0次

    本章将要探讨——I/O重定向 功能。I/O 是input/output的缩写。这个功能可以把命令行的输入 重定向为从文件中获取内容,也可以把命令行的输出结果 重定向到文件中。如果将多个命令行关联起来,将形成非常强大的命令——管道。接下来,将通过介绍以下命令来展示I/O重定向。

    • cat:合并文件。
    • sort:对文本行排序。
    • uniq:报告或删除文件中重复行。
    • wc:打印文件中的换行符、字和字节的个数。
    • grep:打印匹配行。
    • head:输出文件的第一部分内容。
    • tail:输出文件的最后一部分内容。

    一、标准输入、标准输出和标准错误

    ​ 很多程序生成不同种类的输出。
    这些输出通常包含两种类型一种是程序运行的结果(即该程序生成的数据);另一种是状态和错误信息(表示程序当前的运行情况)。比如输入 ls 命令,屏幕上将显示它的运行结果以及它的相关错误信息。

    ​ 与 UNIIX “一切都是文件” 的思想一致。类似 ls 的程序实际上把它们的运行结果发送到了一个称为标准输出的特殊文件中,它们的状态信息则发送到了另一个称为标准错误的文件中。默认情况下,标准输出和标准错误都将被链接到屏幕上,并且不会被保存在磁盘文件中。

    ​ 另外,许多程序从一个称为标准输入的设备来得到输入,默认情况下,标准输入连接到键盘

    ​ I/O 重定向功能,可以改变输出内容发送的目的地,也可以改变输入内容的来源地。通常来说,输出内容显示在屏幕上,输入内容来自于键盘,但是使用 I/O 重定向功能可以改变这一惯例

    1.标准输出重定向

    I/O 重定向功能可以重新定义标准输出内容发送的目的地

    使用重定向操作符“ > ”,后面接文件名,就可以把标准输出重定向到另一个文件中,而不是显示在屏幕上。

    (0)用法格式

    命令 > 文件名

    (1)为什么?

    主要用于把命令的输出内容保存到一个文件中

    (2)例

    ① 示例1

    比如我们创建 /usr/bin 目录的一个长列表信息,并把这个结果输出到 ls-output.txt 文件中,而不是输出到屏幕上。

    ls -l /usr/bin > ls-output.txt
    

    检查下该命令在重定向的输出内容。

    ls -l ls-output.txt
    

    这是一个不错的大型文本文件。如果使用 less 命令查看这个文件,我们可以看到 ls-output.txt 文件确实包含了 ls 命令的执行结果。

    less ls-output.txt
    
    标准输出重定向示例1.png 标准输出重定向示例1-1.png
    ② 示例2

    现在让我们重复重定向测试,但是这次做一点变换,我们把目录名称换成一个不存在的目录 /bin/usr

    ls -l /bin/usr > ls-output.txt
    

    我们会收到一条错误信息,因为我们指定的是一个不存在的目录,所以这个错误信息是正确的,但是为什么这个错误信息显示在屏幕上,而不是重定向到 ls-output-noexist.txt 文件中呢?

    原因是 ls 程序并不会把它运行的错误信息发送到标准输出文件中。而是与大多数写的很好的 UNIX 程序一样,它把错误信息发送到标准错误文件中。因为我们只重定向标准输出,并没有重定向标准错误,所以这个错误信息仍然输出到屏幕上。

    我们将讲述如何重定向标准错误,但是首先先让我们看看这个输出文件发生了什么变化。

    ls -l ls-output.txt
    
    标准输出重定向示例2.png

    当前这个文件大小为零,这是因为当时重定向符 " > " 来重定向标准输出时,目的文件通常会从文件开头部分重新改写

    由于 ls 命令执行后没有输出任何内容,只是显示一条错误信息,所以重定向操作开始重新改写这个文件,并在出现错误的情况下停止操作,最终导致了该文件内容被删除。

    (3)删除一个文件内容或者创建一个新的空文件

    事实上,如果我们需要删除一个文件内容或者创建一个新的空文件,可以采用这样的方式:

    > ls-output.txt
    

    仅仅使用重定向符,并在它之前不加任何命令,就可以删除一个已存在的文件内容,或者创建一个新的空文件。

    (4)在尾部添加输出内容

    那么我们如何能够不从文件的首位置开始覆盖文件,而是从文件的尾部开始添加输出内容呢?

    可以使用重定向符 “ >> ” 来实现。

    ① 格式用法
    命令 >> 文件名
    
    ② 示例
    ls -l /usr/bin >> ls-output.txt
    ​
    # 若 ls-output.txt 已有文件内容,将会从尾部添加输出内容。
    

    若这个文件不存在,将与操作符 “ > ” 作用一样创建这个文件。

    标准输出重定向尾部添加.png

    重复这条命令 3 次,系统将最终生成一个为原来 3 倍大小的输出文件。

    2.标准错误重定向

    标准错误的重定向并不能简单地使用一个专用的重定向符来实现。要实现标准错误的重定向,不得不提到它的文件描述符。一个程序可以把生成的输出内容发送到任意文件流中,如果把这些文件流中的前三个分别对应标准输入文件、标准输出文件 和 标准错误文件,那么 shell 将在内部用文件描述符分别索引他们为 0、1 和 2 。shell 提供了使用文件描述符编号来重定向文件的表示法。由于标准错误等同于文件描述符 2,所以可以使用这种表示法来重定向标准错误。

    ls -l /bin/usr 2> ls-error.txt
    

    文件描述符 “ 2 ” 紧放在重定向符之前,将标准错误重定向到 ls-error.txt 文件中。

    3.将标准输出和标准错误重定向到同一个文件

    在许多情况下,会希望把一个命令的所有输出内容都放在同一个独立的文件中。为此,必须同时重定向标准输出和标准错误。有两种方法可以满足:

    (1)方法1

    传统的方法,在旧版本中的 shell 中使用。

    ls -l /bin/usr > ls-output.txt 2>&1

    使用此方法,将执行两个重定向操作。

    首先,重定向标准输出到 ls-output.txt 文件中,然后使用标记符 2>&1 把文件描述符 2 (标准错误)重定向到文件描述符 1 (标准输出)中。

    注意:

    这些重定向操作的顺序是非常重要的

    (2)方法2

    最近的 bash 版本提供了效率更高的第二种方法来实现这一联合的重定向操作。

    ls -l /bin/usr &> ls-output.txt
    

    只使用一个标记符 “ &> ” 就把标准输出和标准错误都重定向到了 ls-output.txt 文件中。

    4.处理不想要的输出

    有时候,命令执行后我们并不希望得到输出,而是想把这个输出丢弃,尤其是在输出错误和状态信息的情况下更为需要将它们丢弃

    系统提供了一种方法,即通过把输出重定向到一个称为 /dev/null 的特殊文件中来实现它。这个文件是一个称为位桶的系统设备,它接受输入但是不对输入进行任何处理

    以下命令可以用来抑制(或隐藏)一个命令的错误信息。

    ls -l /bin/usr 2> /dev/null
    
    # 把标准错误重定向到/dev/null ,也就是不处理错误信息
    

    (1)位桶

    bit bucket,是一个古老的 UNIX 概念,由于它的普适性,它出现在 UNIX 文化的很多地方。

    因此当某人说他正把你的意见发送到 “ dev null ” 的时候,就知道什么意思了。

    5.标准输入重定向

    (1)cat-合并文件

    cat 命令读取一个或多个文件,并把他们复制到标准输出文件中。(而在默认情况下,标准输出文件又是链接到屏幕上,所以就显示在屏幕上)

    cat 命令经常用来显示短的文本文件

    ① 用法格式

    cat [file...]

    ② cat命令指定单个参数

    在大多数情况下,你可以认为 cat 命令和 DOS 中的TYPE命令类似。使用它显示文件而不需要分页,例如:

    cat ls-output.txt
    ​
    # 将显示 ls-output.txt 文件的内容
    
    ③ cat命令指定多个参数

    由于 cat 命令可以接受多个文件作为输入参数,所以它也可以用来把文件连接在一起

    假设我们下载了一个很大的文件,它已被拆分为多个部分,现在我们想要把各部分连接在一起,并还原为原来的文件。

    例1:

    如果这些文件命名为movie.mpeg.001、movie.mpeg.002 ... movie.mpeg.099,我们可以使用 cat 这个命令让他们重新连接在一起。

    cat movie.mpeg.0* > movie.mpeg
    ​
    # 通过通配符来实现
    

    通配符一般都是按照顺序来扩展的,因此这些参数将按正确的顺序来排列

    ④ cat命令不指定任何参数

    虽然这样很好,但是这跟标准输入有什么关系呢?确实没有任何关系,但是我们可以试试其它的情况,如果输入 cat 命令却不带任何参数,会出现什么样的结果呢?

    cat
    

    没有任何结果,它只是停在那边不动,好像它已经挂起来了,看起来好像是这样的,但是它实际上正在执行我们希望它做的事情。

    如果 cat 命令没有给定任何参数,它将从标准输入读取内容,由于标准输入在默认情况下是连接到键盘,所以实际上它正在等待着从键盘上输入的内容。试下这个:

    cat
    Never Give Up!  # 这个是标准输入,因为在默认情况下标准输入是连接到键盘,所以这是我从键盘上输入的。
    

    下一步,按一下 Ctrl-D告知 cat 命令它已经达到了标准输入的文件尾(EOF)。

    cat命令不指定任何参数.png

    在缺少文件名参数的情况下,cat 命令将把标准输入内容复制到标准输出文件中,因此我们将看到文本行重复显示(也就是,第一行是标准输入,第二行是标准输出)。

    用这种方法我们可以创建短的文本文件

    如果想要创建一个名叫 wsq.txt 的文件,文件中包含之前例子中的文本内容,我们可以这样做:

    cat > wsq.txt
    # 含义:因为没有参数,所以cat命令会将标准输入复制到标准输出文件。又因使用了重定向标准输出操作符”>“,
    所以将输出内容文件保存到 wsq.txt文件中。
    
    cat wsq.txt
    # 含义:cat命令读取wsq.txt内容,并复制到标准输出文件中(即显示到屏幕上)。
    
    cat不指定参数创建短文本文件.png

    在cat命令后输入想要放在文件中的文本内容。记住在文件结束时按下 Ctrl-D。使用这个命令行,相当于执行了世界上最愚蠢的文字本处理器。为了看到结果,我们可以使用cat命令再把文件复制到标准输出文件中.

    (2)标准输入重定向

    现在我们已经知道 cat 命令除了接受文件名参数之外,是如何接受标准输入的。接下来尝试下标准输入重定向:

    cat < wsq.txt
    # 含义:首先这个是没有指定参数的,所以它会从标准输入读取内容。而此时使用了重定向符 ” < “,
    所以标准输入的源更改为 wsq.txt 文件。
    
    重定向标准输入.png

    使用重定向符 ” < “,我们将把标准输入的源从键盘变为 wsq.txt 文件。可以看到,得到的结果和只传递单个文件名参数的结果一样。和传输一个文件名参数的方式作对比,这种方式并不是特别的有用,但是可以用来说明把一个文件作为标准输入的源文件。还有其他的命令更好地使用了标准输入,稍后会讲到。

    在继续学习下命令之前,我们可以查看命令的手册文档,因为他有几个有趣的选项。

    相关文章

      网友评论

        本文标题:06-1重定向

        本文链接:https://www.haomeiwen.com/subject/silvhktx.html