文章目录
cat:合并文件
sort:对文本行排序
uniq:报告或删除文件中重复的行
wc:打印文件中的换行符、字和字节的个数
grep:打印匹配行
head:输出文件的第一部分内容
tail:输出文件中的最后一部分内容
tee:读取标准输入的数据,并将其内容输出到标准输出和文件中
1、标准输入、标准输出和标准错误
我们使用过的很多程序生成了不同种类的输出,这些输出通常包含两种类型。一种是程序运行的结果,即该程序生成的数据;另一种是状态和错误信息,表示程序当前的运行情况。比如输入ls
命令,屏幕上将显示它的运行结果以及它的相关错误信息。
与UNIX“一切都是文件”的思想一致,类似ls
的程序实际上把它们的运行结果发送到了一个成为标准输出(standard output,通常表示为stdout)的特殊文件中,它们的状态信息则发送到了另一个称为标准错误(standard error,表示为stderr)的文件中。默认情况下,标准输出和标准错误都将被链接到屏幕上,并且不会被保存在磁盘文件中。
另外,许多程序从一个称为标准输入(standard input,表示为stdin)的设备来得到输入。默认情况下,标准输入连接键盘。
1.1、标准输出重定向
I/O重定向功能可以重新定义标准输出内容发送到哪里。使用重定向操作符>
,后面接文件名,就可以把标准输出重定向到另一个文件中,而不是现实在屏幕上。为什么我们要这么做呢?它主要用于把命令的输出内容保存到一个文件中。比如,我们可以按照下面的形式把ls
命令的输出保存到ls-output.txt文件中,而不是输出到屏幕上。
使用less ls-output.txt
查看文件中的内容:
如果我们输入的指令是错误的,则会在屏幕上输出错误信息,因为我们只重定向了标准输出,而没有重定向标准错误,所以这个错误仍然会输出到屏幕上。
注意:
(1)、使用重定向,目的文件通常会从问价开通部分重写改写,如果采用错误指令重定向,当重定向操作开始重写改写这个文件时,并在出现错误的情况下停止操作,最终导致改文件内容被删除。基于这个特性我们可以采用下面的方法新建一个文件或者删除文件内的内容:
仅仅使用重定向符,并在它之前不加任何命令,就可以删除一个已经存在的文件内容或者创建一个新的空文件。
(2)、使用重定向符>>
可实现不从文件的首位置开始覆盖文件,而是从文件的尾部开始添加输出内容。
ls / > ls-output.txt
ls -l / >> ls-output.txt
使用cat
命令可以将文件合并,例如:
movie.mpeg.001 movie.mpeg.002 movie.mpeg.003 ... movie.mpeg.099
cat movie.mpeg.0* movie.mpeg
如果cat
命令没有给定任何参数,它执行不会有任何结果–它只是停在那边不动,好像它已经挂起了。实际上它将从标准输入读取内容,由于标准输入在默认情况下是连接键盘,所以实际上它正在等待着从键盘输入内容。
1.2、管道
命令从标准输入到读取数据,并将数据发送到标准输出的能力,是使用了名为管道的shell特性。使用管道操作符|
可以把一个命令的标准输出传送到另一个命令的标准输入中:command1 | command2
例如:ls -l /usr/bin | less
1.2.1、过滤器
管道功能进程用来对数据执行复杂的操作。也可以把多条命令合在一起构成一个管道。这种方式中用到的命令通常被称为过滤器(filter)。过滤器接收输入,按照某种方式对输入进行改变,然后再输出它。第一个要用到的是sort
。假设要把/bin和/usr/bin目录下的所有可执行程序合并成一个列表,并且按照顺序排列,最后在查看这个列表:
ls /bin /usr/bin | sort | lsee
1.2.2、uniq–报告或忽略文件中重复的行
uniq
命令经常和sort
命令结合使用。uniq
可以接受来自标准输入或者一个单一文件名参数对应的已排好序的数据列表(可以查看uniq
命令的man
页面获取详细信息)。默认情况下,该命令删除列表中的所有重复行。因此,在管道中添加uniq
命令,可以确保所有的列表都没有重复行。
1、使用uniq
命令删除输出内容中的任意重复行
ls /bin /usr/bin | sort | uniq | less
2、使用-d
选项查看输出内容中重复行
ls /bin /usr/bin | sort | uniq -d | less
1.2.3、wc–打印行数、字数和字节数
wc
(字数统计,word count)命令用来显示文件中包含的行数、字数和字节数,例如:
输出内容第一项为行数,第二项为字数,第三项为字节数。
注意:如果执行wc
是没有输入命令行参数,它将接收标准输入内容。-l
选项限制命令只报告行数,把它添加在管道中可以很方便地实现计数功能。如果我们要查看以排好序的列表中的条目数,可以按一下方式输入:
ls /bin /usr/bin | sort | uniq | wc -l
1.2.4、grep–打印匹配行
grep
是一个功能强大的程序,它用来在文件中查找匹配文本,其使用方式如下:
grep pattern [file...]
当grep
在文件中遇到“模式”的时候,将打印出包括该模式的行。grep
能够匹配的模式内容可以是非常复杂的。
注意:
-i
:该选项使得grep
在搜索时忽略大小写(通常情况下,搜索是区分大小写的)
-v
:该选项使得grep
只输入和模式不匹配的行
1.2.5、head/tail–打印文件的开头部分/结尾部分
有的时候,你并不需要命令输出所有的内容,可能只需开头几行或者最后几行。head
命令将输出文件的前10行,tail
命令则输出文件的最后10行。默认情况下,这两条命令都是输出文件的10行内容,不过可以使用-n选项来调整输出的行数。
tail
中的-f
选项用来实时查看文件,一旦添加了新行,新行将会立即显示在屏幕上,该动作在按下Ctrl -C后停止。
1.2.6、tee–从stdin读取数据,并同时输出到stdout和文件
为了和我们的管道隐喻保持一致,Linux提供了一个叫做tee
的命令,就好像安装了一个"T"在管道上。tee
程序读取读取标准输入,再把读到的内容复制到标准输出(允许数据可以继续向下传递到管道中)和一个或者更多的文件中去。当在某个中间处理阶段来捕获一个管道中的内容是,会很有用。
例如:ls /usr/bin | tee ls.txt | grep zip