shell快讲第一节--shell基础
shell快讲第二节--管道与重定向
shell快讲第三节--正则表达式
shell快讲第四节--sed与awk
shell快讲第五节--shell语法基础
shell快讲第六节--shell函数编程
shell快讲第七节--shell编程规范与调试
shell快讲第八节--shell编程实战
管道
严格的说管道属于IO重定向的一部分,但是我们不思考那么多,管道在Shell操作中经常遇到,管道符号是“|”,它是我们在命令与命令之间(或者说进程与进程之间)通信的一种手段,我们先看下原理
guandao.png
我们实际来操作一下:
>>> ls -l |grep *.png |wc -l #查找当前目录的所有文件中的png文件并输出它们的数量
>>> cat testfile |grep error #过滤某个文件中的包含错误信息的行
重定向
类型 | 文件描述符 | 默认情况 | 对应设备位置 |
---|---|---|---|
标准输入 | 0 | 从键盘获得输入 | /dev/stdin |
标准输出 | 1 | 输出到控制台 | /dev/stdout |
错误输出 | 2 | 输出到控制台 | /dev/stderr |
1.STDIN
stdin代表shell的标准输入,对终端来说,标准输入就是键盘,默认定向到控制台,当然我们可以使用“<”符号定向到其他地方作为stdin输入(累次开发中的生产消费模式),当然必须注意不是所有的命令都可以接收stdin输入。如下例子:
#测试输入,cat可以接受stdin的输入并把内容打印出来
>>> cat #随便输入点什么
stdin效果演示
#将某个文件作为stdin输入给cat命令使用
>>> echo "hello world" > testfile #创建testfile文件并保存一段话
>>> cat < testfile #讲testfile作为cat的输入
另外我们可以使用“<<”进行追加模式的stdin输入,相对于"<",“<<”我们更加常用:
>>> cat >testfile <<EOF #注意"<<"
>你好
>hello world
>EOF
#此时生成一个testfile文件,我们打开它
>>> cat testfile
#没错,这就是上节课的例子
2.STDOUT
stdout代表shell的标准输出,输出到终端显示器,shell和程序的绝大多数输出都是标准输出,默认是输出到控制台,当然我们可以使用“>”重定向到其他地方,">>"是它的追加模式
>>> ls -l #标准输出
>>> ls -l >test1 #输出到test1里面
>>> echo "追加文档到test1" >> test1
3.STDERR
shell对于错误消息的处理和普通的输出是分开的,某些开发写的程序不标准,经常会把标准输出和标准错误输出弄混,然后运维就更辛苦点了。标准错误输出和标准输出一样都是默认输出到控制台的。stderr的默认输出虽然是控制台但是却不会被“>”符号重定向,我们看个例子:
>>> ls -l ajflajfa >testfile #讲ajflajfa文件的属性输出到testfile里面,但是ajflajfa根本不存在
>>> cat testfile #查看文件
实验过后其实会发现stderr的输出不会像stdout那样被重定向到textfile里面,但是在日常工组中,我们会有要求把所有的正常的日志输出,非正常的日志输出都放在一个文件里面
#将标准输出,标准错误输出均输入到一个文件里面
>>> ls -l test1 test2 >testfile 2>&1 #test1存在,test2不存在,或:
>>> ls -l test1 test2 &>testfile #另外一种写法
>>> cat testfile
>>> ls -l test1 test2 2>errout 1>output #错误信息输出到errout 正确的信息输出到output
如下是符号的重定向对比列表
符号 | 说明 |
---|---|
> | 把stdout(标准输出)重定向到文件,文件内容会被覆盖 |
>> | 把stdout(标准输出)重定向到文件,内容追加到文件的末尾 |
2> | 把stderr(标准错误输出)重定向到文件,文件内容会被覆盖 |
2>> | 把stderr(标准错误输出)重定向到文件,内容追加到文件末尾 |
2>&1或&> | 把stdout和stderr作为一个数据流重定向到文件,文件内容会被覆盖 |
&>> | 把stdout和stderr作为一个数据流重定向到文件,内容追加到文件末尾 |
< | 将文件重定为stdin |
<< | 作为stdin输入的文件可以被追加,不过需要使用EOF作为文件的截断符号 |
重定向在接下来的章节会比较长用到,这里列几个基于管道的命令工具传送门,这些工具大家自己练习
总结
希望大家结合自己的工作场景练习上面的命令,如果有开发基础,理解std并不困难,不过有无开发基础都不妨理解管道这个概念。
网友评论