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

 

 

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

1.左边的命令应该有标准输出 | 右边的命令应该接受标准输入
   左边的命令应该有标准输出 > 右边只能是文件
   左边的命令应该需要标准输入 < 右边只能是文件

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

 

二:举个栗子

 

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

 

【提醒注意】:

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

订阅

微信搜索“毕小烦”或者扫描下面的二维码,即可订阅我的文章。

image.png

如果文章对你有帮助,请随手点个赞吧!

(完)

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毕小烦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值