Linux基础扫盲篇之Shell中的重定向和管道

I/O 重定向

I/O 是输入/输出的缩写,通过I/O重定向可将命令行的输入重定向为从文件中获取内容,也可以将命令行的输出结果重定向到文件中。

重定向标准输出

需要使用到的重定向符>,但是这只能用于标准输出,标准错误信息仍会显示在屏幕上。

//将ls命令的输出保存到文件中
[zhy@ubuntu ~]$ ls -l /user/bin > ls-output.txt

//将输出结果追加在文件末尾
[zhy@ubuntu ~]$ ls -l /user/bin >> ls-output.txt
重定向标准错误

可以通过文件描述符来重定向标准错误

[zhy@ubuntu ~]$ ls -l /bin/user 2> ls-error.txt
将标准输出和标准错误重定向到同一个文件

第一种是传统方法

[zhy@ubuntu ~]$ ls -l /bin/user > ls-output.txt 2>&1

传统方法首先重定向标准输出到ls-output.txt文件中,然后使用标记符2>&1把文件描述符2(标准错误)重定向到文件描述符1(标准输出)中。

第二种是效率更高的方法

[zhy@ubuntu ~]$ ls -l /bin/user &> ls-output.txt

使用&>将标准输出和标准错误都重定向到ls-output.txt

处理不想要的输出

当我们不希望得到输出时,可以将输出结果重定向到一个称为/dev/null 的特殊文件中,这个文件是一个称为位桶的系统设备。

[zhy@ubuntu ~]$ ls -l /bin/user 2> /dev/null
cat 合并文件

cat命令读取一个或多个文件,并把他们按顺序复制到标准输出文件中.

[zhy@ubuntu ~]$ cat file1 file2 ...

//会将输出内容显示到屏幕上(默认标准输出)
[zhy@ubuntu ~]$ cat file

//当使用cat未指明参数时,它将从标准输入读取内容(默认标准输入是键盘)
[zhy@ubuntu ~]$ cat

//将读取的文件重定向到文件中
[zhy@ubuntu ~]$ cat file1 > file2.txt
重定向标准输入

使用重定向符<,可以将标准输入的源从键盘变成file.txt文件

//标准输入重定向
[zhy@ubuntu ~]$ cat < file.txt
管道

使用管道操作符|(竖线)可以把一个命令的标准输出传送到另一个命令的标准输入中。

[zhy@ubuntu ~]$ Command1 | command2

//less命令可以分页显示任意命令的输入,下面这条命令将它的结果发送到标准输出
[zhy@ubuntu ~]$ ls -l /user/bin | less

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

//把/bin和/user/bin目录下的所有可执行程序合并成一个列表,并且按照顺序排列,最后再查看这个列表
[zhy@ubuntu ~]$ ls /bin /user/bin | sort | less

//在显示出来的列表中不包含重复的行可以使用uniq命令
[zhy@ubuntu ~]$ ls /bin /user/bin | sort | uniq | less
//如果你不合逻辑想要查看重复的行可在uniq后跟上参数-d
[zhy@ubuntu ~]$ ls /bin /user/bin | sort | uniq -d | less

//打印文件行数、字数、字节数
[zhy@ubuntu ~]$ wc file.txt

//打印匹配行。下面的命令从列出的程序中搜索出文件名中包含zip的所有文件
//grep存在一对方便的选项:-i,使得在搜索时忽略大小写。-v,使得只输出和模式不匹配的行。
[zhy@ubuntu ~]$ ls /bin /user/bin | grep zip
打印文件的开头/结尾部分

有时候我们打开一个文件并不想查看所有内容,于是可以使用head/tail来选择性的输出指定的行数,默认情况下head将输出文件的前10行,tail则输出文件的最后10行。不过可以使用-n选项来调整输出的行数。

//输出file的前10行
[zhy@ubuntu ~]$ head file.txt

//输出file的前3行
[zhy@ubuntu ~]$ head -n 3 file.txt

//列出程序的前5行
[zhy@ubuntu ~]$ ls /bin | head -n 5
扩展

echo命令

传递给echo的任何参数都将显示出来

[zhy@ubuntu ~]$ echo i love you
i love you

路径名扩展

[zhy@ubuntu ~]$ echo D*
Desktop Documents

[zhy@ubuntu ~]$ echo /user/*/share
/user/kerberos/share /user/local/share

花括号扩展

花括号扩展算是比较奇怪的扩展方式,有了它,可以按照花括号中的模式创建多种文本字符串。

[zhy@ubuntu ~]$ echo love_{you1,you2,you3}
love_you1 love_you2 love_you3

[zhy@ubuntu ~]$ echo Number_{1..5}
Number_1 Number_2 Number_3 Number_4 Number_5

[zhy@ubuntu ~]$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z

[zhy@ubuntu ~]$ echo a{A{1,2},B{3,4}}b
aA1b aA2b aB3b aB4b

除此之外,花括号扩展还有一些比较实用的意义,比如创建一系列按年月格式命名的目录:

[zhy@ubuntu ~]$ mkdir {2009..2011}-0{1..9} {2009..2011}-{10..12}
[zhy@ubuntu ~]$ ls
2009-01  2009-05  2009-09  2010-01  2010-05  2010-09  2011-01  2011-05  2011-09
2009-02  2009-06  2009-10  2010-02  2010-06  2010-10  2011-02  2011-06  2011-10
2009-03  2009-07  2009-11  2010-03  2010-07  2010-11  2011-03  2011-07  2011-11
2009-04  2009-08  2009-12  2010-04  2010-08  2010-12  2011-04  2011-08  2011-12

看起来是不是相当奇妙喃!

参数扩展

参数扩展与系统存储小块数据以及给每个小块数据命名的性能有关。有很多的小块数据(或称为变量)可用于扩展。例如,命名为USER的变量就包含了你的用户名:

[zhy@ubuntu ~]$ echo $USER
zhy

通过以下命令可查看可用的变量列表

[zhy@ubuntu ~]$ printenv | less

命令替换

命令替换可以把一个命令的输出作为一个扩展模式使用。

[zhy@ubuntu ~]$ echo $(ls)

[zhy@ubuntu ~]$ ls -l $(which cp)
-rwxr-xr-x 1 root root 120708 1119  2012 /bin/cp

更多文章请关注我的个人博客:www.zhyocean.cn

猜你喜欢

转载自blog.csdn.net/swpu_ocean/article/details/81987805