Linux学习记录六——重定向


前言

  本篇文章我们将要探索命令行最酷的功能——I/O(input/output)重定向。这个功能可以把命令行的输入输出重定向为从文件中获取内容,也可以把命令行的输出结果重定向到文件中。如果我们将多个命令行关联起来,将形成非常强大的命令——管道。

一、标准输入、标准输出、标准错误

1.1 什么是标准输入、标准输出、标准错误

  执行一个shell命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。使用重定向功能可以改变这一惯例。

1.2 标准输出重定向

  当我们需要将命令的输出保存到文件中,而不是显示到屏幕上时,我们可以使用重定向操作符“>”,后面接文件名,就可以把标准输出重定向到另一个文件中,而不是显示到屏幕上。
例子:

yrf-tan@yrftan-Lenovo-G50-70m:~$ ls -l /home/yrf-tan
total 81436
drwxrwxr-x 17 yrf-tan yrf-tan     4096 5月  19 22:34 deepin-wine-for-ubuntu
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Desktop
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Documents
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  22 22:20 Downloads
-rw-r--r--  1 yrf-tan yrf-tan     8980 5月  18 22:41 examples.desktop
-rw-rw-r--  1 yrf-tan yrf-tan 83325072 5月   8 10:29 google-chrome-stable_current_amd64.deb
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Music
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  31 23:16 Pictures
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Public
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Templates
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Videos
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  18 23:13 下载
drwxr-xr-x  3 yrf-tan yrf-tan     4096 5月  18 22:53 音乐
yrf-tan@yrftan-Lenovo-G50-70m:~$ ls -l /home/yrf-tan >ls-output.txt
yrf-tan@yrftan-Lenovo-G50-70m:~$ 

现在让我们来查看一下这个文件

yrf-tan@yrftan-Lenovo-G50-70m:~$ less ls-output.txt

total 81436
drwxrwxr-x 17 yrf-tan yrf-tan     4096 5月  19 22:34 deepin-wine-for-ubuntu
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Desktop
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Documents
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  22 22:20 Downloads
-rw-r--r--  1 yrf-tan yrf-tan     8980 5月  18 22:41 examples.desktop
-rw-rw-r--  1 yrf-tan yrf-tan 83325072 5月   8 10:29 google-chrome-stable_current_amd64.deb
-rw-rw-r--  1 yrf-tan yrf-tan        0 6月   1 11:37 ls-output.txt
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Music
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  31 23:16 Pictures
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Public
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Templates
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Videos
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  18 23:13 下载
drwxr-xr-x  3 yrf-tan yrf-tan     4096 5月  18 22:53 音乐
~

如果我们重定向了一个不存在的文件会发生什么?让我们来试试;

yrf-tan@yrftan-Lenovo-G50-70m:~$ ls -l /yrf-tan >ls-output.txt
ls: cannot access '/yrf-tan': No such file or directory

  我们收到了一条错误信息,因为我们重定向一个不存在的文件;且ls程序不会把这个运行的错误信息发送到标准输出文件,而是发送到标准错误文件中。因为我们只重定向了标准输出,并没有重定向标准错误,所以这个错误仍然输出到屏幕上。
我们再来看看输出文件发生了什么;

yrf-tan@yrftan-Lenovo-G50-70m:~$ ls -l ls-output.txt
-rw-rw-r-- 1 yrf-tan yrf-tan 0 6月   1 11:45 ls-output.txt

  当前文件大小变成了0。这是因为使用重定向符“>”,来重定向标准输出时,目的文件通常会从文件开头部分重新改写。由于ls没有输出任何内容,所以重定向操作开始重新改写这个文件,并在出现错误的情况下停止操作导致这个文件内容被删除。事实上,如果我们需要删除一个文件内容(或者创建一个新的空文件),可以采用这样的方式。

yrf-tan@yrftan-Lenovo-G50-70m:~$ > ls-output.txt

  仅仅使用了重定向符,并在它之前不叫任何命令,就可以删除一个已存在的文件内容或创建一个新的空文件夹。
   我们可以使用重定向符“>>”来实现从文件的尾部开始添加输出内容。 如果这个文件不存在,则与操作符“>”的作用一样创建这个文件。

yrf-tan@yrftan-Lenovo-G50-70m:~$ ls -l /home/yrf-tan > ls-output.txt
yrf-tan@yrftan-Lenovo-G50-70m:~$ ls -l ls-output.txt
-rw-rw-r-- 1 yrf-tan yrf-tan 942 6月   1 12:16 ls-output.txt
yrf-tan@yrftan-Lenovo-G50-70m:~$ > ls-output.txt

yrf-tan@yrftan-Lenovo-G50-70m:~$ ls -l /home/yrf-tan >> ls-output.txt
yrf-tan@yrftan-Lenovo-G50-70m:~$ ls -l /home/yrf-tan >> ls-output.txt
yrf-tan@yrftan-Lenovo-G50-70m:~$ ls -l /home/yrf-tan >> ls-output.txt
yrf-tan@yrftan-Lenovo-G50-70m:~$ ls -l ls-output.txt
-rw-rw-r-- 1 yrf-tan yrf-tan 2826 6月   1 12:15 ls-output.txt

连续使用这条命令三次,系统最终生成一个为原来大小三倍的输出文件。

1.3 标准错误重定向

标准错误的重定向不能简单的使用一个专用的的重定向符来实现,要实现标准错误的重定向要先提到它的文件描述符(file descriptor) 一个程序可以把生成的输出内容发送到任意文件流中。如果把这些文件流中的前三个分别对应标准输入文件。标准输出文件和标准错误文件,那么,shell将在内部用文件描述符分别索引它们为0、1、2.。shell提供了使用文件描述符编号来重定向文件的表示法。由于标准错误等于文件描述符2,所以可以使用这种表示法来重定向标准错误。

yrf-tan@yrftan-Lenovo-G50-70m:~$ ls -l yrf-tan 2>ls-error.txt
yrf-tan@yrftan-Lenovo-G50-70m:~$ ls -l ls-error.txt
-rw-rw-r-- 1 yrf-tan yrf-tan 55 6月   1 12:30 ls-error.txt

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

  我们有两种方法实现同时重定向标准输出和标准错误。
第一种是传统的方法在旧版本的shell中使用。

~$ ls -l /home/yrf-tan >ls-output.txt 2>&1

  使用这个方法将进行两次重定向操作。首先重定向标准输出到 ls-output.txt 文件中,然后使用标记符 2>&1 把文件描述符2(标准错误)重定向到文件描述符1(标准输出)中。反正我觉得这种方法很麻烦,使用的时候重定向操作的顺序也非常重要,顺序错了将不起作用。

  第二种效率更高且简单,直接使用 &>就可以了;

~$ ls -l /home/yrf-tan &> ls-output.txt

1.5 处理不想要的输出

  当我们不希望得到输出时,可以把输出重定向到一个称为 /dev/null 的特殊文件中来实现。这个文件是一个被称为位桶(bit bucket)的系统设备,它接受输入但是不对输入进行任何处理。
例如:

~$ ls -l /home/yrf-tan > /dev/null

1.6 标准输入重定向

cat——合并文件

  cat读取一个或多个文件,并将它们复制到标准输出文件中,格式如下:
cat [file…]
  使用cat显示文件不需要分页,例如:

yrf-tan@yrftan-Lenovo-G50-70m:~$ cat ls-output.txt
total 81440
drwxrwxr-x 17 yrf-tan yrf-tan     4096 5月  19 22:34 deepin-wine-for-ubuntu
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Desktop
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Documents
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  22 22:20 Downloads
-rw-r--r--  1 yrf-tan yrf-tan     8980 5月  18 22:41 examples.desktop
-rw-rw-r--  1 yrf-tan yrf-tan 83325072 5月   8 10:29 google-chrome-stable_current_amd64.deb
-rw-rw-r--  1 yrf-tan yrf-tan       55 6月   1 12:30 ls-error.txt
-rw-rw-r--  1 yrf-tan yrf-tan        0 6月   1 12:43 ls-output.txt
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Music
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  31 23:16 Pictures
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Public
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Templates
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Videos
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  18 23:13 下载
drwxr-xr-x  3 yrf-tan yrf-tan     4096 5月  18 22:53 音乐

  由于cat可以接受多个文件作为输入参数,所以它也可以用来把文件连接在一起(可以联系通配符)。
  如果cat命令没有给定任何参数,它将从标准输入读取内容.试一下输入内容,然后同时按Ctrl和D,告知cat命令它已经到达标准输入的文件尾,结束输入。

yrf-tan@yrftan-Lenovo-G50-70m:~$ cat
gaoxin is a silly boy.
gaoxin is a silly boy.

  用这种方法我们可以创建短的文本文件,比如,如果我们要创建一个叫sb_gaoxin的文件,文件中包含之前例子中的文本内容,我们可以这样:

yrf-tan@yrftan-Lenovo-G50-70m:~$ cat > sb_gaoxin.txt
Gaoxin is a silly boy.
yrf-tan@yrftan-Lenovo-G50-70m:~$ cat sb_gaoxin.txt
Gaoxin is a silly boy.

  在cat命令后输入想要放在文件中的文本内容,结束时按Ctrl+D。接下来我们试一试标准输入的重定向。

yrf-tan@yrftan-Lenovo-G50-70m:~$ cat < sb_gaoxin.txt
Gaoxin is a silly boy.

  使用重定向符“<”,我们可以将标准输入的源从键盘变成文件。和传输一个文件名作为参数的方式作对比,这种方式不是特别有用,还有其他命令可以更好的使用标准输入,以后再补。

二、管道

2.1 什么是管道

  命令从标准输入到读取数据,并将数据发送到标准输出的能力,是使用了名为管道的shell特性。使用管道操作符“|”(竖线)可以把一个命令的标准输出传送到另一个命令的标准输入中。格式如下:
command1 | command2
我们试一试,less命令可以接受标准输入,使用less命令可以分页显示任意命令的输入。以下命令将它的结果发送到标准输出

~$ ls -l /home/yrf-tan | less

运行结果:

total 81448
drwxrwxr-x 17 yrf-tan yrf-tan     4096 5月  19 22:34 deepin-wine-for-ubuntu
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Desktop
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Documents
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  22 22:20 Downloads
-rw-r--r--  1 yrf-tan yrf-tan     8980 5月  18 22:41 examples.desktop
-rw-rw-r--  1 yrf-tan yrf-tan 83325072 5月   8 10:29 google-chrome-stable_current_amd64.deb
-rw-rw-r--  1 yrf-tan yrf-tan       55 6月   1 12:30 ls-error.txt
-rw-rw-r--  1 yrf-tan yrf-tan     1009 6月   1 12:43 ls-output.txt
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Music
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  31 23:16 Pictures
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Public
-rw-rw-r--  1 yrf-tan yrf-tan       23 6月   1 13:25 sb_gaoxin.txt
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Templates
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Videos
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  18 23:13 下载
drwxr-xr-x  3 yrf-tan yrf-tan     4096 5月  18 22:53 音乐

通过使用该技术,我们可以方便地检查任意一条生成标准输出的命令的运行结果。

2.2 过滤器

管道功能经常用来对数据执行复杂的操作。也可以把多条命令合在一起构成一个管道。这种方式中用到的命令通常被称为过滤器(filter)。过滤器接受输入,按照某种方式对输入进行改变,然后再输出它。

2.3 sort——将一个列表按序排列

  sort命令可以将目录下的所有可执行程序合并成一个列表,并按照顺序排列。通过在管道中包含sort命令,我们改变输出数据,从而产生一个排好序的列表。
我们来试试吧:

~$ ls -l /home /home/yrf-tan |sort |less

运行结果:

drwxrwxr-x 17 yrf-tan yrf-tan     4096 5月  19 22:34 deepin-wine-for-ubuntu
drwxr-xr-x 23 yrf-tan yrf-tan 4096 6月   1 13:25 yrf-tan
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  18 23:13 下载
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Desktop
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Documents
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Music
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Public
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Templates
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Videos
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  22 22:20 Downloads
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  31 23:16 Pictures
drwxr-xr-x  3 yrf-tan yrf-tan     4096 5月  18 22:53 音乐
/home:
/home/yrf-tan:
-rw-r--r--  1 yrf-tan yrf-tan     8980 5月  18 22:41 examples.desktop
-rw-rw-r--  1 yrf-tan yrf-tan     1009 6月   1 12:43 ls-output.txt
-rw-rw-r--  1 yrf-tan yrf-tan       23 6月   1 13:25 sb_gaoxin.txt
-rw-rw-r--  1 yrf-tan yrf-tan       55 6月   1 12:30 ls-error.txt
-rw-rw-r--  1 yrf-tan yrf-tan 83325072 5月   8 10:29 google-chrome-stable_current_amd64.deb
total 4
total 81448

2.4 uniq——报告或忽略文件中重复的行

  uniq命令经常和sort命令结合使用。uniq命令可以接受来自标准输入或一个单一文件名参数对应的已经排好序的数据列表。默认情况下,该命令会删除列表中的重复行(即在目录下都出现的相同名字的任意程序),可以确保所有的列表都没有重复行。

试一试:

~$ ls /home /home/yrf-tan |sort |uniq |less

输出结果:

deepin-wine-for-ubuntu
Desktop
Documents
Downloads
examples.desktop
google-chrome-stable_current_amd64.deb
/home:
/home/yrf-tan:
ls-error.txt
ls-output.txt
Music
Pictures
Public
sb_gaoxin.txt
Templates
Videos
yrf-tan
下载
音乐
(END)

如果要查看重复行的列表,只需要在uniq后面加上 -d选项即可。

2.5 wc——打印行数、字数和字节数

  wc(word count 字数统计)命令用来显示文件中包含的行数、字数和字节数.
例如:

yrf-tan@yrftan-Lenovo-G50-70m:~$ wc ls-output.txt
  16  137 1009 ls-output.txt

  输出了三条数据,依次分别是行数、字数和字节数,我们可以加入 -l选项限制命令只报告行数,把它加入到管道中可以很方便地实现计数功能。
例如:

$ ls /home /home/yrf-tan |sort |uniq |wc -l
20

2.6 grep——打印匹配行

  grep用来在文件中查找匹配文件,其使用方法如下:
grep pattern[file…]
  当grep在文件中遇到“模式(pattern)”的时候,将打印出包含该模式的行。grep存在一对方便的选项; -i,该选项使得grep在搜索时忽略大小写(通常情况下搜索是区分大小写的);-v,该选项使得grep只输出和模式不匹配的行。

2.7 head/tail——打印文件的开头/结尾部分

  head命令将输出文件的前10行,tail命令将输出文件的最后10行。不过可以使用 -n选项来调整输出的行数。这些命令也可以应用到管道中。

yrf-tan@yrftan-Lenovo-G50-70m:~$ head ls-output.txt
total 81440
drwxrwxr-x 17 yrf-tan yrf-tan     4096 5月  19 22:34 deepin-wine-for-ubuntu
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Desktop
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Documents
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  22 22:20 Downloads
-rw-r--r--  1 yrf-tan yrf-tan     8980 5月  18 22:41 examples.desktop
-rw-rw-r--  1 yrf-tan yrf-tan 83325072 5月   8 10:29 google-chrome-stable_current_amd64.deb
-rw-rw-r--  1 yrf-tan yrf-tan       55 6月   1 12:30 ls-error.txt
-rw-rw-r--  1 yrf-tan yrf-tan        0 6月   1 12:43 ls-output.txt
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Music

yrf-tan@yrftan-Lenovo-G50-70m:~$ head -n 5 ls-output.txt
total 81440
drwxrwxr-x 17 yrf-tan yrf-tan     4096 5月  19 22:34 deepin-wine-for-ubuntu
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Desktop
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  20 16:30 Documents
drwxr-xr-x  2 yrf-tan yrf-tan     4096 5月  22 22:20 Downloads

tail中有一个十分有用的选项来实时查看文件,该选项在观察正在被写入的日志文件的进展状态时很有用,使用 -f选项,tail将持续监视这个文件,一旦添加了新行,新行将会显示在屏幕上。这个动作在按下Ctrl-C后停止。

2.8 tee——从stdin读取数据,并同时输出到stdout和文件

  tee程序读取标准输入,再把读到的内容复制到标准输出(允许数据可以继续向下传递到管道中)和一个或更多的文件中。当在某个中间处理阶段来捕获一个管道的内容时会很有用。
例子:

yrf-tan@yrftan-Lenovo-G50-70m:~$ ls /usr/bin |tee ls.txt |grep zip
funzip
gpg-zip
mzip
p7zip
preunzip
prezip
prezip-bin
unzip
unzipsfx
zip
zipcloak
zipdetails
zipgrep
zipinfo
zipnote
zipsplit

该处使用的url网络请求的数据。


总结

这篇文章只是介绍了这些命令的最基本用法,还有许多有趣的用法需要自己去发现,这个过程有点像拼积木,提供给你功能,你自己去开发玩法。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值