linux学习之管道符与管道命令

目录:
1、管道符
2、管道命令
3、管道
4、重定向、多命令顺序执行、tee命令、xargs命令

一、管道符
linux中,“|”就是管道符,也叫管道命令操作符,简称管道符。就是将前面一个命令正确标准输出信息,作为下一个命令的标准输入。
其实就是第一个命令的正确标准输出是第二个命令的标准输入,第二个命令的正确标准输出是第三个命令的标准输入,以此类推。
如下图所示:

二、管道命令
http://www.cnblogs.com/lemonbar/archive/2014/08/24/3933390.html
1、grep 分析一行信息,如果匹配,就将该行取出。
(1)参数
-a : 将binary文件以 text文件的方式搜寻数据
-c : 计算找到搜索条件的次数
-i : 忽略大小查找
-n : 输出行号
-v : 去除包含 -v后面条件的那一行
--color = auto : 将查找的关键字加上颜色
(2)例子
grep 'function' *|grep -v 'private'|grep -v '__construct'|grep -v 'checkAuth'|grep -v 'apiLog'|grep -v 'getVerifField'|awk '{print $4}'|less
以上列子等价于
grep ‘funciton’ *|grep -vE 'private|__construct|checkAuth|apiLog|getVerifField'|awk '{print $4}'|less
-E 启用扩展选项
2、awk 一个强大的文本分析工具
(1)参数
-F:指定分隔符。注意一定要大写。
(2)例子
在api_base.txt 中不区分大小写查找包含‘’coupons‘’ 的行,根据空格分隔,并取第一列
grep -i 'coupons' api_base.txt|awk '{print $1}'|less
在api_base.txt 中不区分大小写查找包含‘’coupons‘’ 的行,根据‘’.php‘’分隔,并取第一列
grep -i 'coupons' api_base.txt|awk -F '.php' '{print $1}'|less
2、cut 选取命令。将一段数据经过分析,取出我们想要的。一般选取信息都是针对行来说的。
(1)参数
-d : 后面接分隔符,与-f 一起使用
-f : 将-d取出的数据截取其中的几段。
-c : 以字符为单位取出固定字符区间
(2)例子
截取3-5字节的数据
grep 'coupons' api_base.txt|cut -b 3-5
以:作为分隔符截取第一段
grep 'coupons' api_base.txt|cut -d ':' -f 1
3、sort 排序。可以根据不同类型排序。
(1)参数
-f : 忽略大小。其实是将小写字母转换成大写字母来比较,相当于忽略大小
-b : 忽略最前面的空格符
-M : 以月份的名字来排序
-n : 数字排序
-r : 反向排序
-u : 去重
-t : 分隔符,默认Tab
-k : 与t相关,用分割的哪一段排序
(2)例子
升序排序
[root@shiyong api]# grep 'coupons' api_base.txt|sort
Mkt_coupons.php: function getByUser()
Mkt_coupons.php: function getCouponList()
Mkt_coupons.php: function subUserCouponsChange()
Mkt_coupons.php: function syncCoupons()

降序排序
[root@shiyong api]# grep 'coupons' api_base.txt|sort -r
Mkt_coupons.php: function syncCoupons()
Mkt_coupons.php: function subUserCouponsChange()
Mkt_coupons.php: function getCouponList()
Mkt_coupons.php: function getByUser()

4、unique 去重。重复行只显示一行。
(1)参数
-i : 忽略大小
-c : 计算次数
(2)例子
去重
[root@shiyong api]# grep 'function' api_users.txt|uniq
Shop_user.php: function updateByUserId()
shop_user.php: function updateByUserId()
Vuser.php: function create()
vuser.php: function create()
去重不区分大小写
[root@shiyong api]# grep 'function' api_users.txt|uniq -i
Shop_user.php: function updateByUserId()
Vuser.php: function create()

去重并且计算次数
[root@shiyong api]# grep 'function' api_users.txt|uniq -c
4 Shop_user.php: function updateByUserId()
1 shop_user.php: function updateByUserId()
4 Vuser.php: function create()
1 vuser.php: function create()

去重不区分大小写并且计算次数
[root@shiyong api]# grep 'function' api_users.txt|uniq -c -i
5 Shop_user.php: function updateByUserId()
5 Vuser.php: function create()
5、wc 计算输出信息的整体数据
(1)参数
-l : 统计行数
-w : 统计字数
-m : 统计字符数
(2)例子
grep 'function' api_users.txt|wc
10 30 360
行数 单词数 总字符数
grep 'function' api_users.txt|wc -l
10
6、tee 双重定向。 既输出到屏幕,又可以输出到文件
(1)参数
-a : 追加
(2)例子
[root@shiyong api]# grep 'coupons' api_base.txt|tee test2.txt
Mkt_coupons.php: function syncCoupons()
Mkt_coupons.php: function subUserCouponsChange()
Mkt_coupons.php: function getCouponList()
Mkt_coupons.php: function getByUser()
7、tr 删除或者替换某一段字符串
(1)参数
-d : 删除
-s : 替换
(2)例子
[root@shiyong api]# grep 'coupons' api_base.txt|tr -d 'getByUser'
Mk_coupon.php: funcion ncCoupon()
Mk_coupon.php: funcion ubCouponChan()
Mk_coupon.php: funcion CouponLi()
Mk_coupon.php: funcion ()
[root@shiyong api]# grep 'coupons' api_base.txt|tr -s 'ct' '1111'
Mk1_1oupons.php: fun1ion syn1Coupons()
Mk1_1oupons.php: fun1ion subUserCouponsChange()
Mk1_1oupons.php: fun1ion ge1CouponLis1()
Mk1_1oupons.php: fun1ion ge1ByUser()

这边命令有很多,就不一一来说明了。除了这些,还可以使用col,join,paste,expand 等等。
三、管道
linux中的管道描述的是进程之间是如何通信的,管道可以分为无名管道和命名管道。我平时用的“|”管道符就是无名管道。

四、延伸知识点
1、重定向
linux重定向 与 文件描述符(FD)有关。shell中FD通常有10个,0~9;
常用的FD有3个:
0:标准输入(stdin);
1:标准输出(stdout);
2:标准错误输出(stderr);
对于3~9,则分给了正在打开的额外文件。
>:输出重定向到文件,并且覆盖。
>>:以追加的方式输入到文件
<:输入重定向到一个程序
2 >& 1 : 标准错误输出重定向到标准输出
重定向与管道符的区别:
1、管道符左右两边都是命令,且左边命令应该有标准输出,右边命令需要可以接收左边命令的标准输出。
2、重定向左边是命令,右边只能是文件或者设备。
2、多命令顺序执行
; :分号。命令1;命令2; 命令之间无联系
&&:逻辑与。命令1&&命令2
|| :逻辑或。命令1 || 命令2
多命令顺序执行与管道符的区别:
1、管道符两边命令是有联系的;
2、多命令执行两边的命令是无联系的;
[root@shiyong api]# grep 'cartDataGet' api_base.txt;ll
Buy.php: function cartDataGet()
总计 140
-rw-r--r-- 1 root root 31995 01-19 13:31 api_base.txt
-rw-r--r-- 1 root root 70781 01-19 13:31 apidoc.txt
-rw-r--r-- 1 root root 2461 01-19 13:31 api_ins.txt
-rw-r--r-- 1 root root 22 01-19 13:31 api_polymerize.txt
-rw-r--r-- 1 root root 778 01-19 13:31 api_trades.txt
-rw-r--r-- 1 root root 366 01-19 15:03 api_users.txt
-rw-r--r-- 1 root root 1096 01-19 13:31 api_weixin.txt
-rw-r--r-- 1 root root 169 01-19 14:33 test1.txt
-rw-r--r-- 1 root root 169 01-19 14:50 test2.txt
-rw-r--r-- 1 root root 169 01-19 14:33 test.txt
[root@shiyong api]# cp test.txt test1.txt && echo 'success'
success

3、tee命令
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
就是既会输出到屏幕,也会输出到指定的文件。
4、xargs命令
(1)将标准输入作为命令的参数。
(2)通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。
(3)一般与find一起使用。
find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
find . -name "api_base.txt"|xargs grep 'coupons'|less

发表评论