第六章 重定向
本章讨论的话题是命令行中相当重要的一部分——I/O重定向,这个功能可以把命令行中的输入重定向为文件中的内容,也可将命令行的输出结果重定向到文件中,甚至可以将一个命令的输出成为另一个命令的输入,如果将多个命令关联起来,将会形成一个非常强大的命令——管道。
本章涉及相关命令:
cat: 合并文件
sort:对文本进行排序
uniq:报告文件或删除文件中重复的行。
wc:打印文件中的换行符,字,和字节的个数
grep:打印匹配行。
head和tail:输出文件的第一部分和最后一部分的内容。
tee:读取标准输入的数据,并将其内容输出到标准输出和文件中。
一:标准输入,标准输出和标准错误
STDIN 0 键盘输入
STDOUT 1 输出信息到提示符窗口
STDERR 2 输出错误信息到提示符窗口
前面几张我们运行的命令的输入输出都是使用的标准输入输出,从键盘输入数据,然后输出数据到终端中。使用重定向功能可以改变这个惯例。
1:标准输入重定向。
标准输出重定向符号:>
格式:commad > filename
将命令的输出输出到filename文件中,可看下面的例子:
在终端运行命令 ls -a ,这时没用用重定向,输出到终端中,接下来用重定向功能将 ls -a的输出重定向到 dd.txt中(如果不存在则创建),则dd.txt中的内容如下所示:
需要注意的一点是:>重定向符只是将标准输出重定向到文件dd.txt中,如果命令发生错误,则错误信息并不会重定向到文件中,而是输出到终端,比如前面的例子,ls -a /usr/ddyyxx > dd.txt 假设/usr/ddyyxx不存在,则在终端中会输出错误信息。
并且这个时候可以发现dd.txt中的内容为空。因为使用重定向符“>”时,目的文件会从文件开头部分重新改写,并且覆盖之前的内容。
由于前面这个命令什么也没输出,那么输出就是0,则会将目标文件清空。
如果想要使目标文件从文件末尾开始改写,应该使用重定向符号“>>”,这样就不会覆盖之前的内容了。
另外一个小技巧就是:如果想要新建一个空文件或者删除一个文件的文件内容,可以使用下面的方式:
> filename
仅仅使用重定向符号,之前什么命令也不加,就可以达到目的。
2:标准错误成重定向:
标准错误的重定向并不能简单地使用一个一个专有重定向符实现。
要实现标准错误的重定向,先要了解文件描述符。
当某个程序打开文件时,操作系统返回相应的文件描述符,程序为了处理该文件必须引用此描述符。所谓的文件描述符是一个低级的正整数。最前面的三个文件描述符(0,1,2)分别与标准输入(stdin),标准输出(stdout)和标准错误(stderr)对应。
由于标准错误等同与文件描述符2,所以可以用下面的方法重定向标准错误。
ls -a /usr/ddyyxx 2> error.txt
其中文件描述符“2”紧放在重定向符之前,将标准错误重定向到error.txt中。
另外:如果想将标准输出和标准错误同时重定向到同一文件,可以用 &>符号即可。
3:标准输入重定向
标准输入重定向符为“<”,和标准输出重定向格式类似,即将文件中的内容作为命令的输入。只作用于可以接受标准输入的命令。这里不再详细说明。
二:管道
管道比重定向使用得更加广泛。命令从标准输入读取数据,并将数据发送到标准输出的能力,就是使用了名为管道的特性。
管道的操作符位“|”(竖线)。可以将一个命令的标准输出传送到另一个命令的标准输入中。
commad1 | commad2
如前面介绍过得的less命令,使用ls -a /usr less命令,可以得到如下结果:
管道功能可以对数据进行复杂的操作,可将多个命令合在一起构成一个管道。下面先介绍一些命令,再将它们与管道结合起来形成一个可完成复杂功能的命令。
1:cat命令:
cat命令的用途是连接文件或标准输入并打印。这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用。
命令格式:
cat [选项] [文件]...
命令功能:
cat主要有三大功能:
1). 一次显示整个文件:cat filename
2). 从键盘创建一个文件:cat > filename 只能创建新文件,不能编辑已有文件.
3). 将几个文件合并为一个文件:cat file1 file2 > file
关于cat命令的详细描述,可参考这篇文章:http://www.cnblogs.com/peida/archive/2012/10/30/2746968.html
2: wc
(1)命令格式:
wc [选项]文件...
(2)命令功能:
统计指定文件中的字节数、字数、行数,并将统计结果显示输出。该命令统计指定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所指定文件的总统计数。
(3) 命令参数:-c 统计字节数。
-l 统计行数。
-m 统计字符数。这个标志不能与 -c 标志一起使用。
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-L 打印最长行的长度。
-help 显示帮助信息
--version 显示版本信息
3:sort
sort命令可以对一个文件中的文本行进行排序,它的功能相当强大,可以根据选项对文本使用不同优先级或标准的排序操作。
格式:sort [选项] 文件...
-b 忽略每行前面开始出的空格字符。
-d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
-f 排序时,将小写字母视为大写字母。
-i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
-c 检查文件是否已经按照顺序排序。
-m 将几个排序好的文件进行合并。
-M 前面3个字母依照月份的缩写进行排序。
-n 依照数值的大小排序。
-o<输出文件> 将排序后的结果存入指定的文件。
-r 以相反的顺序来排序。
-t<分隔字符> 指定排序时所用的栏位分隔字符。
-k 指定域
--help 显示帮助。
--version 显示版本信息。
关于sort命令的详细描述,可参考手册或者这篇文章:http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html
4:uniq
uniq命令经常和sort命令一起使用,功能是对已经排序好的数据列表,去除所有重复的行。
格式: uniq [选项] 文件
说明:这个命令读取输入文件,并比较相邻的行。在正常情况下,第二个及以后更多个重复行将被删去,行比较是根据所用字符集的排序序列进行的。该命令加工后的结果写到输出文件中。输入文件和输出文件必须不同。如果输入文件用“- ”表示,则从标准输入读取。
该命令各选项含义如下:
– c 显示输出中,在每行行首加上本行在文件中出现的次数。它可取代- u和- d选项。
– d 只显示重复行。
– u 只显示文件中不重复的各行。
– n 前n个字段与每个字段前的空白一起被忽略。一个字段是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从0开始编号)。
+n 前n个字符被忽略,之前的字符被跳过(字符从0开始编号)。
– f n 与- n相同,这里n是字段数。
– s n 与+n相同,这里n是字符数。
关于uniq命令的详细描述和实例可以参考:http://os.51cto.com/art/201107/274991.htm
5:grep
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。
grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
1.命令格式:
grep [选项] 模式 文件
2.命令功能:
用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。
关于grep命令的详细描述可参考:http://www.cnblogs.com/peida/archive/2012/12/17/2821195.html
6:tee
tee命令读取标准输入,再把读到的内容复制到标准输出和一个或更多的文件中去,形象一点的描述就是在管道中安装了一个“T”。
tee命令在某个中间阶段捕获管道中的内容时会非常有用。
tee [选项] [文件]
描述:
将标准输入复制到每个指定的文件中,也输出到标准输出上
选项:
-a 不覆盖,而是追加输出到指定的文件中
-i 忽略中断信息
--help: 显示帮助信息并退出
--version: 显示版本信息并退出
若指定的输出文件为'-',则再次输出到标准输出上
下面介绍管道的用法。
前面说过,管道的作用是将一个命令的输出发送到另一个命令的输入,用重定向同样可以做到这一点:
commad1 > file.txt
commad2 < file.txt
但是这样不仅很笨拙,而且还增加了中间文件。
使用管道能够实时地将一个命令的输出传送到另一个命令的输入,而不是要等第一个命令完成后,再将输出传送个下一个命令。
接下来举一些例子来介绍管道的使用方式:
(1):去除命令输出中重复的行,可以用下面的命令
commad | sort | uniq | less
将命令的输出排序后,再去重,再将剩下的输出传送到less命令中。
(2):打印输出内容中的行数,字数,和字节数
commad | wc
我们也可将管道和重定向一起使用,如下
commad | wc > out.txt
(3)搜索历史目录中包含关键字的内容
commad | grep pattern
上面只是管道的基本用法,有关管道更加详细的介绍和实例分析可以参考这篇文章
http://www.cnblogs.com/chengmo/archive/2010/10/21/1856577.html