《linux命令行大全》读书笔记 第六章 重定向

                                             第六章 重定向

      本章讨论的话题是命令行中相当重要的一部分——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

猜你喜欢

转载自blog.csdn.net/dyx404514/article/details/41357869
今日推荐