shell输入输出重定向

I/O 重定向允许我们可以更改输出走向和输入来向。 一般地,输出送到屏幕,输入来自键盘, 但是通过
I/O 重定向,我们可以改变输入输出方向。

重定向命令列表如下:

命令 说明
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)。

输出重定向

当我们使用 “ >” 重定向符来重定向输出结果时,目标文件总是从开头被重写。因此,如果我们需要删除一个文件内容(或者创建一个 新的空文件),可以使用这样的技巧:

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

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

对于 >> 命令,如果文件不存在,文件会被创建,就如使用了” >” 操作符。

错误重定向

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

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

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

重定向标准输出和错误到同一个文件,可以用以下方式:

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

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

注意重定向的顺序安排非常重要。标准错误的重定向必须总是出现在标准输出重定向之后,要不然它不起
作用。

输入重定向

一种常用的使用方式是:

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》

猜你喜欢

转载自blog.csdn.net/hmxz2nn/article/details/81046175