shell中的重定向

这可能是命令行最酷的特性。它叫做 I/O 重定向。”I/O”代表输入/输出, 通过这个工具,你可以重定向命令的输入输出,命令的输入来自文件,而输出也存到文件。 也可以把多个命令连接起来组成一个强大的命令管道。为了展示这个工具,我们将叙述 以下命令:

  • cat - 连接文件

  • sort - 排序文本行

  • uniq - 报道或省略重复行

  • grep - 打印匹配行

  • wc - 打印文件中换行符,字,和字节个数

  • head - 输出文件第一部分

  • tail - 输出文件最后一部分

  • tee - 从标准输入读取数据,并同时写到标准输出和文件

标准输入、输出和错误

重定向标准输出

[hjw@localhost ~]$ ls -l /home/hjw/ >hjw.txt

通过 > 号我们可以把ls -l 生产的输出内容写入到hjw.txt文件中,由文件代替屏幕。如果hjw.txt不存在会自动创建这个文件。并且写入到文件都是从开头重写。如果/home/hjw/ 是一个不存在的目录,屏幕上会出现错误信息,并且hjw.txt文件内容会被清空(如果有内容的话)。

[hjw@localhost ~]$ > hjw.txt

因此如果我们使用上面的命令,可以很方便的清空一个文件的内容。

如果我们想在文件末尾添加内容而不是开头重写,我们可以使用 >>

[hjw@localhost ~]$ ls -l /usr/local >>hjw.txt

这样使用后,输出内容会添加在hjw.txt末尾,而不是清空文件内容

重定向标准错误

[hjw@localhost ~]$ ls -l /home/hj/ 2>hjw_error.txt

这里的目录是一个不存在的目录,因此会出现错误,我们使用 2> 可以把错误信息写入到 hjw_error.txt中,而不是直接显示到屏幕上

重定向标准输出与错误到同一个文件

[hjw@localhost ~]$ ls -l /home/hj/ >hjw.txt 2>&1

这条命令表示标准输出写入到hjw.txt文件中,标准错误信息写入上一个描述符中,也就是hjw.txt中。所以他们的顺序也不能反过来

[hjw@localhost ~]$ ls -l /home/hj/ &>hjw.txt 

这条命令与上一条相同,&> 是bash新版本中提供的

处理不需要的输出

[hjw@localhost ~]$ ll /home/hj 2> /dev/null

有时我们不想要一个命令的输出结果,我们可以把它输出到 /dev/null 这个特殊的文件中。这个文件是系统设备,叫作 位存储桶,它可以接受输入,并不对输入作任何操作。我们可以用它来隐藏错误信息

重定向标准输入

[hjw@localhost ~]$ cat hjw.txt

cat 命令可以用来读取一个或多个文件,然后复制它们到标准输出。这条命令会在屏幕上输出hjw.txt的内容。

[hjw@localhost ~]$ cat 

只输入一个cat命令,我们可以回车直接输入内容。Ctrl + D结束输入。会发现我们之前输入的内容重复出现在屏幕上,因为cat 接收了标准输入并把内容复制到标准输出了

[hjw@localhost ~]$ cat >hjw2.txt

我们可以使用Cat来创建一个文件。输入上述命令后回车输入文件内容,Ctrl+ D 结束输入后,我们浏览hjw2.txt ,之前在屏幕中输入的内容已经写入到了文件中。

[hjw@localhost ~]$ cat <hjw2.txt

同样的,我们可以将标准输入源改成文件。回车后输出文件内容。

管道线

[hjw@localhost ~]$ ls -l /usr/bin | less

使用管道操作符”|”(竖杠),一个命令的标准输出可以通过管道送至另一个命令的标准输入
这个表示将ls输出的内容使用less来浏览。

过滤器

[hjw@localhost ~]$ ls bin redis-3.2.9/ | sort | less

把目录/bin 和/redis-3.2.9 中 的可执行程序都联合在一起,再把它们排序,然后浏览执行结果

uniq - 报道或忽略重复行

[hjw@localhost ~]$ ls bin redis-3.2.9/ | sort | uniq | less

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

[hjw@localhost ~]$ ls bin redis-3.2.9/ | sort | uniq | wc -l

grep - 打印匹配行

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

[hjw@localhost ~]$ ls bin redis-3.2.9/ | grep conf

返回ls的结果中包含 conf的记录

grep -i     忽略大小写
grep -v     只打印不匹配的行

head / tail - 打印文件开头部分/结尾部分

有时我们不需要文件的所有内容,只需要开头或结尾的几行

[hjw@localhost ~]$ ls bin redis-3.2.9/ | tail

查看ls结果的结尾十行。head 与 tail 默认都是十行。可以自己指定显示几行

[hjw@localhost ~]$ ls bin redis-3.2.9/ | head -n 5

显示开头的前五行

[hjw@localhost ~]$ head -n 2 hjw.txt

显示hjw.txt文件的前2行

[hjw@localhost ~]$ tail -f hjw.txt

tail -f 可以监测文件的变动。执行命令后,如果hjw.txt有新内容添加时,会实时的显示在屏幕中

tee - 从 Stdin 读取数据,并同时输出到 Stdout 和文件

[hjw@localhost ~]$ ls redis-3.2.9/ | tee ls.txt | grep conf

tee 程序从标准输入读入数据,并且同时复制数据 到标准输出(允许数据继续随着管道线流动)和一个或多个文件。这里我们在过虑之前把 redis-3.2.9目录内容捕捉到ls.txt中

猜你喜欢

转载自blog.csdn.net/ftdd_hw/article/details/78385898
今日推荐