1.使用重定向
重定向就是不使用系统的标准输入端口、标准输出端口或标准错误端口,而进行重新的指定,所以重定向分为输入重定向、输出重定向和错误重定向。通常情况下,重定向到一个文件。在shell中,要实现重定向主要依靠重定向符,即shell是检查命令行中有无重定向符来决定是否需要实施重定向。下表列出了常用的重定向符。
表-重定向符
重定向符 | 说明 |
< | 实现输入重定向。输入重定向并不经常使用,因为大多数命令都以参数的形式在命令行上指定输人文件的文件名。尽管如此,当使用一个不接受文件名为输入参数的命令,而需要的输入又是在一个已存在的文件中时,就能用输入重定向解决问题 |
>或>> | 实现输出重定向。输出重定向比输人重定向更常用。输出重定向使用户能把一个命令的输出重定向到一个文件中,而不是显示在屏幕上。很多情况下都可以使用这种功能。例如,如果某个命令的输出很多,在屏幕上不能完全显示,即可把它重定向到一个文件中,稍后再用文本编辑器来打开这个文件 |
2>或2>> | 实现错误重定向 |
&> | 同时实现输出重定向和错误重定向 |
要注意的是,在实际执行命令之前,命令解释程序会自动打开(如果文件不存在,则自动创建)且清空该文件(文中已存在的数据将被删除)。当命令完成时,命令解释程序会正确地关闭该文件,而命令在执行时并不知道它的输出流已被重定向。
下面举几个使用重定向的例子。
- 将1s命令生成的/(mp目录的一个清单存到当前目录中的dir文件中。
[root@RHEL7-1~]# 1s -1 /tmp >dir - 将1s命令生成的/etc 目录的一个清单以追加的方式存到当前目录中的dir文件中。
[root@RHEL7-1 ~]# 1s -l /etc >>dir - passwd文件的内容作为we命令的输入(wc命令用来计算数字,可以计算文件的Byte数、字数或是列数,若不指定文件名称,或是所给予的文件名为“-”,则wc指令会从标准输入设备读取数据)。
[root@RHEL7-1 ~]# wc</etc/passwd - 将命令myprogram的错误信息保存在当前目录下的 err file文件中。
[root@RHEL7-1~]# myprogram 2>err_file - 将命令myprogram的输出信息和错误信息保存在当前目录下的output fle文件中。
[root@RHEL7-1~]# myprogram &>output_file - 将命令1s的错误信息保存在当前目录下的er file文件中。
[root@RHEL7-1 ~]# ls -1 2>err_file
注意:该命令并没有产生错误信息,但err_file文件中的原文件内容会被清空。
当我们输入重定向符时,命令解释程序会检查目标文件是否存在。如果不存在,命今解释程序将会根据给定的文件名创建一个空文件;如果文件已经存在,命令解释程序则会清除其内容并准备写入命令的输出到结果。这种操作方式表明:当重定向到一个已存在的文件时需要十分小心,数据很容易在用户还没有意识到之前就丢失了。
Bash输入输出重定向可以通过使用下面选项设置为不覆盖已存在文件:
[root@RHEL7-1~)# set -o noclobber
这个选项仅用于对当前命令解释程序输入输出进行重定向,而其他程序仍可能覆盖已存在的文件。
- /dev/null。
空设备的一个典型用法是丢弃从ind或grep等命令送来的错误信息:
[root@RHEL7-1~)# grep delegate /etc/* 2>/dev/null
上面的grep 命令的含义是M/etc目录下的所有文件中搜索包含字符串“delegate"”的所有行。由于我们是在普通用户的权限下执行该命令,grep 命令是无法打开某些文件的,系统会显示一大堆“未得到允许”的错误提示。通过将错误重定向到空设备,我们可以在屏幕上只得到有用的输出。
2.使用管道
许多Linux命令具有过滤特性,即一条命令通过标准输入端口接收一个文件中的数据,命令执行后产生的结果数据又通过标准输出端口送给后一条命令,作为该命令的输入数据。后一条命令也是通过标准输入端口接收输入数据。
shell提供管道命令“|”将这些命令前后衔接在一起,形成一个管道线。格式为
命令1|命令2|...|命令n
管道线中的每一条命令都作为一个单独的进程运行,每一条命令的输出作为下一条命令的输入。由于管道线中的命令总是从左到右顺序执行的,所以管道线是单向的。
管道线的实现创建了Linux系统管道文件并进行重定向,但是管道不同于/O重定向,输入重定向导致一个程序的标准输人来自某个文件,输出重定向是将一个程序的标准输出写到一个文件中,而管道是直接将一个程序的标准输出与另一个程序的标准输入相连接,不需要经过任何中间文件。
例如:
[root@RHEL7-1~]# who >tmpfile
我们运行命令who来找出谁已经登录进入系统。该命令的输出结果是每个用户对应一行数据,其中包含了一些有用的信息,我们将这些信息保存在临时文件中。
现在我们运行下面的命令:
[root@RHEL7-1~]# wc-l <tmpfile
该命令会统计临时文件的行数,最后的结果是登录进入系统中的用户的人数。
我们可以将以上两个命令组合起来。
[root@RHEL7-1~]# who|wc -l
管道符号告诉命令解释程序将左边的命令(在本例中为who)的标准输出流连接到右边的命令(在本例中为we -1)的标准输入流。现在命令who的输出不经过临时文件就可以直接送到命令we中了。
下面再举几个使用管道的例子。
- 以长格式递归的方式分屏显示/etc目录下的文件和目录列表。
[root@RHEL7-1 ~]# ls -Rl /etc | more - 分屏显示文本文件/etc/passwd的内容。[root@RHEL7-1 ~]# cat /etc/passwd | more
- 统计文本文件/ete/passwd的行数、字数和字符数。[root@RHEL7-1~]# cat /etc/passwd | wo
- 查看是否存在john用户账号。
[root@RHEL7-1 ~]# cat /etc/passwd | grep john - 查看系统是否安装了ssh软件包。
[root@RHEL7-1~]# rpm -qa | grep ssh - 显示文本文件中的若干行。
[root@RHEL7-1~]# tail -15 myfile | head -3
管道仅能操纵命令的标准输出流。如果标准错误输出未重定向,那么任何写入其中的信息都会在终端显示屏幕上显示。管道可用来连接两个以上的命令。由于使用了一种被称为过滤器的服务程序,所以多级管道在Linux中是很普遍的。过滤器只是一段程序,它从自己的标准输入流读入数据,然后写到自己的标准输出流中,这样就能沿着管道过滤数据。在下例中:
[root@RHEL7-1 ~]# who|grep root| we -1
who命令的输出结果由grep 命令来处理,而grep命令则过滤掉(丢弃掉)所有不包含字符串“root”的行。这个输出结果经过管道送到命令 wc,而该命令的功能是统计剩余的行数,这些行数与网络用户的人数相对应。
Linux系统的一个最大的优势就是按照这种方式将一些简单的命令连接起来,形成更复杂的、功能更强的命令。那些标准的服务程序仅仅是一些管道应用的单元模块,在管道中它们的作用更加明显。