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


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

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' [email protected] <logcat.log
24  
25 bixiaopeng@bixiaopengtekiMacBook-Pro ~$ cat logcat.log | mail -s 'www.wirelessqa.com2' [email protected]
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

 

【提醒注意】:

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

【每天一个Linux命令】04. Linux中管道命令与重定向区别_第1张图片

你可能感兴趣的:(【每天一个Linux命令】04. Linux中管道命令与重定向区别)