您的位置:首页 > 运维架构 > Linux

【每天一个Linux命令】04. Linux中管道命令与重定向区别

2013-05-24 09:40 841 查看



一:管道命令与重定向区别

1.左边的命令应该有标准输出 |右边的命令应该接受标准输入

左边的命令应该有标准输出 > 右边只能是文件

左边的命令应该需要标准输入 < 右边只能是文件

2.管道触发两个子进程执行”|”两边的程序;而重定向是在一个进程内执行


二:举个栗子

view
source

01
#"|"管道两边都必须是shell命令
02
bixiaopeng@bixiaopengtekiMacBook-Pro
 ~$
cat
logcat.log
 |
grep
Displayed
03
05-22
 23:22:57.674 I
/ActivityManager
( 
 389): Displayed com.taobao.taobao
/com
.taobao.tao.detail.DetailActivity:
 +2s448ms
04
05-22
 23:25:18.385 I
/ActivityManager
( 
 389): Displayed com.android.mms/.ui.ConversationList: +1s68ms
05
05-22
 23:25:28.166 I
/ActivityManager
( 
 389): Displayed com.android.contacts/.activities.PeopleActivity: +1s160ms
06
05-22
 23:25:32.385 I
/ActivityManager
( 
 389): Displayed com.android.contacts/.activities.DialtactsActivity: +630ms
07
05-22
 23:27:26.955 I
/ActivityManager
( 
 389): Displayed com.android.contacts/.activities.PeopleActivity: +251ms
08
05-22
 23:27:31.948 I
/ActivityManager
( 
 389): Displayed com.android.mms/.ui.ConversationList: +299ms
09
05-22
 23:27:36.502 I
/ActivityManager
( 
 389): Displayed com.android.vending/.AssetBrowserActivity: +1s34ms
10
11
#"重定向"符号,右边只能是文件(普通文件,文件描述符,文件设备)
12
bixiaopeng@bixiaopengtekiMacBook-Pro
 ~$
grep
Displayed
 <logcat.log
13
05-22
 23:22:57.674 I
/ActivityManager
( 
 389): Displayed com.taobao.taobao
/com
.taobao.tao.detail.DetailActivity:
 +2s448ms
14
05-22
 23:25:18.385 I
/ActivityManager
( 
 389): Displayed com.android.mms/.ui.ConversationList: +1s68ms
15
05-22
 23:25:28.166 I
/ActivityManager
( 
 389): Displayed com.android.contacts/.activities.PeopleActivity: +1s160ms
16
05-22
 23:25:32.385 I
/ActivityManager
( 
 389): Displayed com.android.contacts/.activities.DialtactsActivity: +630ms
17
05-22
 23:27:26.955 I
/ActivityManager
( 
 389): Displayed com.android.contacts/.activities.PeopleActivity: +251ms
18
05-22
 23:27:31.948 I
/ActivityManager
( 
 389): Displayed com.android.mms/.ui.ConversationList: +299ms
19
05-22
 23:27:36.502 I
/ActivityManager
( 
 389): Displayed com.android.vending/.AssetBrowserActivity: +1s34ms
20
21
#下面2个也相同,将logcat.log的内容发送到指定邮箱
22
23
bixiaopeng@bixiaopengtekiMacBook-Pro
 ~$mail -s 
'www.wirelessqa.com'
wirelessqa.me@gmail.com
 <logcat.log
24
25
bixiaopeng@bixiaopengtekiMacBook-Pro
 ~$
cat
logcat.log
 |mail -s 
'www.wirelessqa.com2'
wirelessqa.me@gmail.com
26
27
28
#把logcat.log内容重定向到
 sed ,然后sed输出通过管道,输入给grep.需要将前面用"()"运算符括起来
29
bixiaopeng@bixiaopengtekiMacBook-Pro
 ~$(
sed
-n
'1,$p'
|
grep
Displayed)<logcat.log
30
05-22
 23:22:57.674 I
/ActivityManager
( 
 389): Displayed com.taobao.taobao
/com
.taobao.tao.detail.DetailActivity:
 +2s448ms
31
05-22
 23:25:18.385 I
/ActivityManager
( 
 389): Displayed com.android.mms/.ui.ConversationList: +1s68ms
32
05-22
 23:25:28.166 I
/ActivityManager
( 
 389): Displayed com.android.contacts/.activities.PeopleActivity: +1s160ms
33
05-22
 23:25:32.385 I
/ActivityManager
( 
 389): Displayed com.android.contacts/.activities.DialtactsActivity: +630ms
34
05-22
 23:27:26.955 I
/ActivityManager
( 
 389): Displayed com.android.contacts/.activities.PeopleActivity: +251ms
35
05-22
 23:27:31.948 I
/ActivityManager
( 
 389): Displayed com.android.mms/.ui.ConversationList: +299ms
36
05-22
 23:27:36.502 I
/ActivityManager
( 
 389): Displayed com.android.vending/.AssetBrowserActivity: +1s34ms
37
#效果同上面的命令:由于重定向运算符在执行前首先检查它的输入,输出,也就是0,1,2
 设备是否准备好,所以优先级会最高,执行完重定向运算再执行shell命令
38
bixiaopeng@bixiaopengtekiMacBook-Pro
 ~$
sed
-n
'1,$p'
<
logcat.log |
grep
Display
39
05-22
 23:22:57.674 I
/ActivityManager
( 
 389): Displayed com.taobao.taobao
/com
.taobao.tao.detail.DetailActivity:
 +2s448ms
40
05-22
 23:25:18.385 I
/ActivityManager
( 
 389): Displayed com.android.mms/.ui.ConversationList: +1s68ms
41
05-22
 23:25:28.166 I
/ActivityManager
( 
 389): Displayed com.android.contacts/.activities.PeopleActivity: +1s160ms
42
05-22
 23:25:32.385 I
/ActivityManager
( 
 389): Displayed com.android.contacts/.activities.DialtactsActivity: +630ms
43
05-22
 23:27:26.955 I
/ActivityManager
( 
 389): Displayed com.android.contacts/.activities.PeopleActivity: +251ms
44
05-22
 23:27:31.948 I
/ActivityManager
( 
 389): Displayed com.android.mms/.ui.ConversationList: +299ms
45
05-22
 23:27:36.502 I
/ActivityManager
( 
 389): Displayed com.android.vending/.AssetBrowserActivity: +1s34ms
46
47
#这个grep又接受管道输入,又有cat1.log输入,那是不是2个都接收呢?刚才说了"<"运算符会优先,管道还没有发送数据前,grep绑定了cat1.log的输入,这样sed命令输出就被抛弃了。这里一定要小心使用
48
bixiaopeng@bixiaopengtekiMacBook-Pro
 ~$
sed
-n
'1,10p'
<logcat.log
 |
grep
wirelessqa
 <cat1.log
49
www.wirelessqa.com
50
51
#输出重定向
52
53
bixiaopeng@bixiaopengtekiMacBook-Pro
 ~$
cat
cat1.log
 >wire1.log
54
bixiaopeng@bixiaopengtekiMacBook-Pro
 ~$
cat
wire1.log
55
www.wirelessqa.com
56
bixiaopeng
57
58
59
#通过管道实现将结果存入文件,还需要借助命令tee,它会把管道过来标准输入写入文件wire2.log
 ,然后将标准输入复制到标准输出(stdout),所以重定向到/dev/null 不显示输出
60
#">"输出重定向,往往在命令最右边,接收左边命令的,输出结果,重定向到指定文件。也可以用到命令中间。
61
bixiaopeng@bixiaopengtekiMacBook-Pro
 ~$
cat
cat1.log
|
tee
wire2.log
 &>
/dev/null
62
bixiaopeng@bixiaopengtekiMacBook-Pro
 ~$
cat
wire2.log
63
www.wirelessqa.com
64
bixiaopeng
65
#目录下面有:cat4.log
 和cat4.log不存在,因此将ls 命令错误输出输入到err.txt正确输出,还会通过管道发送到grep命令。
66
bixiaopeng@bixiaopengtekiMacBook-Pro
 ~$
ls
cat1.log
 cat2.log cat3.log cat4.log cat5.log 2>err.log |
grep
'cat'
67
cat1.log
68
cat2.log
69
cat3.log
70
71
bixiaopeng@bixiaopengtekiMacBook-Pro
 ~$
cat
cat1.log
 cat2.log cat3.log cat4.log cat5.log 2>err.log |
grep
'wireless'
72
www.wirelessqa.com
73
www.wirelessqa.com
74
wirelessqa
75
www.wirelessqa.com
76
&代表正确与错误输出
 都输入给err.log
77
bixiaopeng@bixiaopengtekiMacBook-Pro
 ~$
ls
cat1.log
 cat2.log cat3.log cat4.log cat5.log &>err.log |
grep
'cat'
78
bixiaopeng@bixiaopengtekiMacBook-Pro
 ~$
cat
err.log
79
ls
:
 cat4.log: No such
file
or
 directory
80
ls
:
 cat5.log: No such
file
or
 directory
81
cat1.log
82
cat2.log
83
cat3.log
【提醒注意】:

一般如果是命令间传递参数,建议用管道,如果处理输出结果需要重定向到文件,建议用重定向输出。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: