快乐的linux命令行-重定向

整理自《快乐的linux命令行一书》。
linux系统版本: Ubuntu 17.04

本章,我们将介绍命令行最酷的特性,叫做I/O重定向,通过这个工具,可以重定向命令的输入输出,命令的输入来自文件,而输出也存到文。也可以把多个命令连接起来组成一个强大而命令管道。我们将介绍以下命令:

cat:连接文件sort : 排序文本行uniq : 报到或省略重复行grep : 打印匹配行wc : 打印文件中的换行符,字和字节个数head : 输出文件第一部分tail : 输出文件最后一部分

1、标准输入、输出和错误

程序,比方说ls,实际上把他们的运行结果输送到一个叫做标准输出(stdout)的特殊文件,而他们的状态信息则送到另一个叫做标准错误的文件(stderr)。默认情况下,标准输出和标准错误都连接到屏幕,而不是保存到磁盘文件。除此之外,许多程序从一个叫做标准输入(stdin)的设备得到输入,默认情况下,标准输入连接到键盘。

2、重定向标准输出

重定向标准输出到另一个文件除了屏幕,我们使用“>”重定向符,其后跟文件名,例如:

重定向输出.png

我们将ls的输出重定向到ls-output.txt文件中。现在 ,我们把目录换成一个不存在的目录:

重定向2.png

可以看到,我们输出了一个错误信息,这条错误信息没有重定向到文件中而是输出到了屏幕上,因为“>”只是重定向了标准输出,而没有重定向标准错误,所以错误出现在了屏幕上,但此时我们的文件已经变了:
重定向3.png

可以发现文件大小变为了0.因为使用“>”重定向符重定向输出结果时,目标文件总是从开头被重写。所以导致文件内容删除,那么我们怎么能把重定向结果追加到文件内容后面呢,使用“>>”重定向符:

重定向4.png

可以看到,即使出现错误,我们的文件大小仍然没有变为0.

3、重定向标准错误

我们使用如下的方式重定向标准错误:

重定向错误.png

可以看到,我们的错误被写入了文件:

重定向错误.png

4、重定向标准输出和错误到同一个文件

如果说2代表标准错误,那么我们可以用1代表标准输出,比如:

重定向5.png

如果我们希望捕捉一个命令的所有输出到一个文件,即同时重定向标准输出和标准错误,有两种方法来完成任务,首先是传统的方法:

重定向5.png

我们在最后添加了2>&1参数,根据大小文件大小可以看出,输出和错误都被重定向到ls-output.txt文件中了。
第二种方法更加精简:
重定向输出和错误2.png

5、处理不需要的输出

有时候我们不想要一个命令的输出结果,我们只想把它扔掉,我们只需要重定向输出结果到一个特殊的叫做“dev/null”的文件。这个文件是系统设备,叫做位存储桶,它可以接受输入,并且对输入不做任何处理:

处理不需要的输出.png

6、cat --连接文件

cat命令读取一个或多个文件,然后复制他们到标准输出:

cat命令1.png

cat还可以用来连接文件,比如我们下载了一个大型文件,这个文件被分为好多部分,我们想把他们连接起来,用如下的命令:

cat连接文件.png

如果cat命令没有接受任何参数,它会从标准输入读入数据,而标准输入默认是键盘,所以它会等待我们输入数据:
cat命令2.png

使用快捷键ctrl+d结束我们的输入,由于没有重定向输出,所以它会将原话输出到屏幕上,如下图:

cat输出.png

我们也可以将cat接受的输入重定向到文件中,并用cat查看:

cat输出2.png

7、管道线

命令可以从标准输入读取数据,然后再把数据送到标准输出,命令的这种能力被一个shell特性所利用,这个特性叫做管道线,一个命令的标准输出可以管道到另一个命令的标准输入:

command1 | command2

比如我们将ls的的输出结果当做标准输入输送到less命令:

管道线1.png

8、过滤器

管道线经常用来对数据完成复杂的操作,有可能会把几个命令放在一起组成管道线。通常,以这种方式使用的命令称为过滤器。过滤器接受输入,以某种方式改变它,然后输出它。比如sort过滤器,把目录/bin和/usr/bin中的可执行程序联合在一起,再把它们排序:

过滤器.png

另一个过滤器是uniq,可以报道或者忽略重复行,默认情况下,从数据列表中删除任何重复行,如果我们想得到重复的数据列,在uniq命令上加上“-d ”选项:

uniq.png

9、wc--打印行、字和字节数

wc命令用来显示文件所包含的行,字和字节数:

wc命令1.png

10、打印匹配行

grep是个很强大的程序,用来找到文件中的匹配文本。这样使用grep命令:

grep pattern [file...]

这里的pattern指匹配模式,grep能够匹配的模式很复杂, 可以是正则表达式,不过这里只展示一个基本的文本匹配,找到文件名中包含zip的所有文件:

grep.png

11、head/tail 打印文件的开头结尾

head命令默认打印文件的前10行,也可以用-n指定打印的行数
而tail命令默认打印文件的后10行,也可以用-n指定打印的行数

head-tail.png

12、tee命令

linux提供了一个tee命令,允许我们保存管道线中的中间结果,并且使数据继续顺着管道线流动:

tee.png

上面的命令使我们在进行grep匹配之前,首先将中间结果,即ls的结果保存到ls.txt中。

如果你喜欢我写的文章,可以帮忙给小编点个赞或者加个关注,我一定会互粉的!
如果大家对linux感兴趣,欢迎跟小编进行交流,小编微信为sxw2251,加我要写好备注哟!

我的微信
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值