shell输入输出重定向

I/O 重定向容许咱们能够更改输出走向和输入来向。 通常地,输出送到屏幕,输入来自键盘, 可是经过
I/O 重定向,咱们能够改变输入输出方向。linux

重定向命令列表以下:web

命令 说明
command > file 将输出重定向到 file
command < file 将输入重定向到 file
command >> file 将输出以追加的方式重定向到 file
n > file 将文件描述符为 n 的文件重定向到 file
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file
n >& m 将输出文件 m 和 n 合并
n <& m 将输入文件 m 和 n 合并
<< tag 将开始标记 tag 和结束标记 tag 之间的内容做为输入

须要注意的是文件描述符 :0是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。shell

输出重定向

当咱们使用 “ >” 重定向符来重定向输出结果时,目标文件老是从开头被重写。所以,若是咱们须要删除一个文件内容(或者建立一个 新的空文件),可使用这样的技巧:less

[me@linuxbox ~]$ > ls-output.txt

简单地使用重定向符,没有命令在它以前,这会删除一个已存在文件的内容或是建立一个新的空文件。svg

对于 >> 命令,若是文件不存在,文件会被建立,就如使用了” >” 操做符。ui

错误重定向

重定向标准错误缺少专用的重定向操做符。 重定向标准错误,咱们必须参考它的文件描述符。 一个程序可
以在几个编号的文件流中的任一个上产生输出。code

[me@linuxbox ~]$ ls -l /bin/usr 2> ls-error.txt

文件描述符” 2” ,紧挨着放在重定向操做符以前,来执行重定向标准错误到文件 ls-error.txt 任务。xml

重定向标准输出和错误到同一个文件,能够用如下方式:排序

[me@linuxbox ~]$ ls -l /bin/usr > ls-output.txt 2>&1

使用这种方法,咱们完成两个重定向。 首先重定向标准输出到文件 ls-output.txt,而后重定向文件描述
符2(标准错误)到文件描述符1(标准输出)。it

注意重定向的顺序安排很是重要。标准错误的重定向必须老是出如今标准输出重定向以后,要否则它不起
做用。

输入重定向

一种经常使用的使用方式是:

command1 < infile > outfile

同时替换输入和输出,执行command1,从文件infile读取内容,而后将输出写入到outfile中。

处理不须要的输出

系统为咱们提供了解决问题的方法,经过重定向输出结果 到一个特殊的叫作” /dev/null” 的文件。 这个文件是系统设备,叫作位存储桶,它能够 接受输入,而且对输入不作任何处理。 为了隐瞒命令错误信息,咱们这样作:

[me@linuxbox ~]$ ls -l /bin/usr 2> /dev/null

与输入输出重定向相关的shell命令

cat

cat 常常被用来显示简短的文本文件。 由于 cat 能够接受不仅一个文件做为参数,因此它也能够用来把文件链接在一块儿。 比方说咱们下载了一个 大型文件,这个文件被分离成多个部分, 咱们想把它们连起来。 咱们能用这个命令把它们链接起来:

cat movie.mpeg.0* > movie.mpeg

由于通配符老是以有序的方式展开,因此这些参数会以正确顺序安排。

若是 cat 没有给出任何参数,它会从标准输入读入数据,由于标准输入,默认状况下,链接到键盘。它正在等待咱们输入数据!试试这个:

[me@linuxbox ~]$ cat
The quick brown fox jumped over the lazy dog.

下一步,输入 Ctrl-d,来告诉 cat,在标准输入中, 它已经到达文件末尾(EOF)。因为文件名参数的缺席,cat 复制标准输入到标准输出,因此咱们看到文本行重复出现。 咱们可使用这种行为来建立简短的文本文件。

管道线

使用管道操做符” |” (竖杠),一个命令的 标准输出能够管道到另外一个命令的标准输入:

command1 | command2

所谓管道,就是之前面命令的输出做为后面命令的输入,从而从前日后的执行。因此说,“管道”这个名字真的很形象。

过滤器

管道线常常用来对数据完成复杂的操做。有可能会把几个命令放在一块儿组成一个管道线。 一般,以这种方式使用的命令被称为过滤器。 过滤器接受输入,以某种方式改变它,而后输出它。 第一个咱们想试验的过滤器是 sort。 想象一下,咱们想把目录/bin 和/usr/bin 中 的可执行程序都联合在一块儿,再把它们排序,而后浏览执行结果:

[me@linuxbox ~]$ ls /bin /usr/bin | sort | less

由于咱们指定了两个目录(/bin 和/usr/bin),ls 命令的输出结果由有序列表组成, 各自针对一个目录。经过在管道线中包含 sort,咱们改变输出数据,从而产生一个有序列表。

uniq

uniq 命令常常和 sort 命令结合在一块儿使用。 uniq 从标准输入或单个文件名参数接受数据有序 列表,默认状况下,从数据列表中删除任何重复行。

wc

wc(字计数)命令是用来显示文件所包含的行,字和字节数。 例如:

[me@linuxbox ~]$ wc ls-output.txt
7902 64566 503634 ls-output.txt
grep

grep 是个很强大的程序,用来找到文件中的匹配文本。

head和tail

head 命令打印文件的前十行,而 tail 命令打印文件的后十行。

tee

tee 程序从标准输入读入数据,而且同时复制数据 到标准输出(容许数据继续随着管道线流动)和一个或多个文件。 当在某个中间处理阶段来捕捉一个管道线的内容时,这颇有帮助。

参考:《The Linux Command Line》