整理自《快乐的linux命令行一书》。
linux系统版本: Ubuntu 17.04
本章,我们将介绍命令行最酷的特性,叫做I/O重定向,通过这个工具,可以重定向命令的输入输出,命令的输入来自文件,而输出也存到文。也可以把多个命令连接起来组成一个强大而命令管道。我们将介绍以下命令:
cat:连接文件
sort : 排序文本行
uniq : 报到或省略重复行
grep : 打印匹配行
wc : 打印文件中的换行符,字和字节个数
head : 输出文件第一部分
tail : 输出文件最后一部分
1、标准输入、输出和错误
程序,比方说ls,实际上把他们的运行结果输送到一个叫做标准输出(stdout)的特殊文件,而他们的状态信息则送到另一个叫做标准错误的文件(stderr)。默认情况下,标准输出和标准错误都连接到屏幕,而不是保存到磁盘文件。除此之外,许多程序从一个叫做标准输入(stdin)的设备得到输入,默认情况下,标准输入连接到键盘。
2、重定向标准输出
重定向标准输出到另一个文件除了屏幕,我们使用“>”重定向符,其后跟文件名,例如:
我们将ls的输出重定向到ls-output.txt文件中。现在 ,我们把目录换成一个不存在的目录:
可以看到,我们输出了一个错误信息,这条错误信息没有重定向到文件中而是输出到了屏幕上,因为“>”只是重定向了标准输出,而没有重定向标准错误,所以错误出现在了屏幕上,但此时我们的文件已经变了:
可以发现文件大小变为了0.因为使用“>”重定向符重定向输出结果时,目标文件总是从开头被重写。所以导致文件内容删除,那么我们怎么能把重定向结果追加到文件内容后面呢,使用“>>”重定向符:
可以看到,即使出现错误,我们的文件大小仍然没有变为0.
3、重定向标准错误
我们使用如下的方式重定向标准错误:
可以看到,我们的错误被写入了文件:
4、重定向标准输出和错误到同一个文件
如果说2代表标准错误,那么我们可以用1代表标准输出,比如:
如果我们希望捕捉一个命令的所有输出到一个文件,即同时重定向标准输出和标准错误,有两种方法来完成任务,首先是传统的方法:
我们在最后添加了2>&1参数,根据大小文件大小可以看出,输出和错误都被重定向到ls-output.txt文件中了。
第二种方法更加精简:
5、处理不需要的输出
有时候我们不想要一个命令的输出结果,我们只想把它扔掉,我们只需要重定向输出结果到一个特殊的叫做“dev/null”的文件。这个文件是系统设备,叫做位存储桶,它可以接受输入,并且对输入不做任何处理:
6、cat --连接文件
cat命令读取一个或多个文件,然后复制他们到标准输出:
cat还可以用来连接文件,比如我们下载了一个大型文件,这个文件被分为好多部分,我们想把他们连接起来,用如下的命令:
如果cat命令没有接受任何参数,它会从标准输入读入数据,而标准输入默认是键盘,所以它会等待我们输入数据:
使用快捷键ctrl+d结束我们的输入,由于没有重定向输出,所以它会将原话输出到屏幕上,如下图:
我们也可以将cat接受的输入重定向到文件中,并用cat查看:
7、管道线
命令可以从标准输入读取数据,然后再把数据送到标准输出,命令的这种能力被一个shell特性所利用,这个特性叫做管道线,一个命令的标准输出可以管道到另一个命令的标准输入:
command1 | command2
比如我们将ls的的输出结果当做标准输入输送到less命令:
8、过滤器
管道线经常用来对数据完成复杂的操作,有可能会把几个命令放在一起组成管道线。通常,以这种方式使用的命令称为过滤器。过滤器接受输入,以某种方式改变它,然后输出它。比如sort过滤器,把目录/bin和/usr/bin中的可执行程序联合在一起,再把它们排序:
另一个过滤器是uniq,可以报道或者忽略重复行,默认情况下,从数据列表中删除任何重复行,如果我们想得到重复的数据列,在uniq命令上加上“-d ”选项:
9、wc--打印行、字和字节数
wc命令用来显示文件所包含的行,字和字节数:
10、打印匹配行
grep是个很强大的程序,用来找到文件中的匹配文本。这样使用grep命令:
grep pattern [file...]
这里的pattern指匹配模式,grep能够匹配的模式很复杂, 可以是正则表达式,不过这里只展示一个基本的文本匹配,找到文件名中包含zip的所有文件:
11、head/tail 打印文件的开头结尾
head命令默认打印文件的前10行,也可以用-n指定打印的行数
而tail命令默认打印文件的后10行,也可以用-n指定打印的行数
12、tee命令
linux提供了一个tee命令,允许我们保存管道线中的中间结果,并且使数据继续顺着管道线流动:
上面的命令使我们在进行grep匹配之前,首先将中间结果,即ls的结果保存到ls.txt中。
如果你喜欢我写的文章,可以帮忙给小编点个赞或者加个关注,我一定会互粉的!
如果大家对linux感兴趣,欢迎跟小编进行交流,小编微信为sxw2251,加我要写好备注哟!