Linux管道符不是你想用就能乱用的!

电子说

1.3w人已加入

描述

一、什么是管道符?

管道符号,是unix一个很强大的功能,符号为一条竖线:"|"。

用法: 命令 1 | 命令 2

功能是把第一个命令,即命令 1执行的结果作为命令 2的输入传给命令 2

例如命令:

 

cat test.txt | wc -l

 

命令功能拆解:

cat test.txt命令功能是打印test.txt文件内容(行数)。

wc -l命令完成行数统计。

整个命令功能就是将cat test.txt的执行结果,通过管道符|,传给后一个命令wc -l,作为wc -l命令的执行对象。

即上述两个命令结合管道符完成对test.txt文件的行数统计。

二、使用管道符的便捷之处

通过上述简单例子,我们应该可以看出使用管道符确实有它便捷的地方。以下罗列几个,让大家加深对于管道符使用的便捷之处。

例子1:通过shell分析,查看2023年4月1日14时这一个小时内有多少IP访问网站;

 

awk '{print $4,$1}' log_file | grep 01/Apr/2023:14 | awk '{print $2}'| sort | uniq | wc -l

 

例子2:通过shell分析网站日志,查看有多少个IP访问?

 

awk '{print $1}' log_file|sort|uniq|wc -l

 

为什么要少用管道符?

这个才是我们本文讲解的重点,也是作为一个高级linux运维人员所要知道的,为什么要少用管道符?并不是说方便就可以大量使用,我们需要考虑到其执行的速度及效率,下面一起通过实例看看管道符要少用的原因!

实例:通过多种统计字符串长度命令的执行效率进行对比,得出管道符要少用的具体原因!

(一)统计字符串长度的命令有哪些?以下举例4个方法。

方法1:通过echo ${#str1} 命令进行统计,其中str1为自定义字符串变量。

方法2:通过expr length "${str1}"命令进行统计,其中str1为自定义字符串变量。

方法3:通过echo命令,结合管道符,以及awk命令实现,如下命令:

 

echo "${str1}" | awk '{print length($0)}'

 

其中str1为自定义字符串变量。

方法4:通过echo命令,结合管道符,以及wc命令实现,如下命令:

 

echo ${#str1} |wc -L

 

其中str1为自定义字符串变量。

(二)以上4种统计字符串长度的方法命令,哪一种效率最高,即速度最快?

以下先通过seq相关命令来生成相关的字符串长度。然后通过for循环执行来控制字符串生成次数的情况下,最后再通过time命令统计整个命令的执行时间,通过同等循环条件下,不同命令,结合直观的运行时间进行比较,得出效率最高的方法。

执行结果1:方法1中,通过echo ${#str1} 命令进行统计,具体命令如下:

 

time for i in {1..10000};do str1=`seq -s "haodao" 100`;echo ${#str1} &> /dev/null;done

 

命令执行结果,所耗时间如下:

 

[root@haodaolinux1 ~]# time for i in {1..10000};do str1=`seq -s "haodao" 100`;echo ${#str1} &> /dev/null;done


real    0m19.519s
user    0m8.606s
sys     0m11.374s

 

通过上述命令执行结果看出,该方法1耗时为19.519秒左右;

执行结果2:方法2中,通过expr length "${str1}" 命令进行统计,具体命令如下:

 

time for i in {1..10000};do str1=`seq -s "haodao" 100`;expr length "${str1}" &> /dev/null;done

 

命令执行结果,所耗时间如下:

 

[root@haodaolinux1 ~]# time for i in {1..10000};do str1=`seq -s "haodao" 100`;expr length "${str1}" &> /dev/null;done


real    0m36.041s
user    0m15.888s
sys     0m21.697s

 

通过上述命令执行结果看出,该方法1耗时为36.041秒左右;

执行结果3:方法3中,通过echo命令,结合管道符,以及awk命令实现 进行统计,具体命令如下:

 

time for i in {1..10000};do str1=`seq -s "haodao" 100`;echo "${str1}" | awk '{print length($0)}' &> /dev/null;done

 

命令执行结果,所耗时间如下:

 

time for i in {1..10000};do str1=`seq -s "haodao" 100`;echo "${str1}" | awk '{print length($0)}' &> /dev/null;done


real    0m45.241s
user    0m21.136s
sys     0m35.092s

 

通过上述命令执行结果看出,该方法1耗时为45.241秒左右;

执行结果4:方法4中,通过echo命令,结合管道符,以及wc命令实现 进行统计,具体命令如下:

 

time for i in {1..10000};do str1=`seq -s "haodao" 100`;echo ${#str1} |wc -L &> /dev/null;done

 

命令执行结果,所耗时间如下:

 

[root@haodaolinux1 ~]# time for i in {1..10000};do str1=`seq -s "haodao" 100`;echo ${#str1} |wc -L &> /dev/null;done


real    0m43.024s
user    0m20.671s
sys     0m34.042s

 

通过上述命令执行结果看出,该方法1耗时为43.024秒左右;

结语:通过以上4种方法执行结果,我们很清楚得出方法1所耗时最少,效率最高。方法2次之;方法3和方法4中都结合了管道符的使用,耗时最多,效率最低。这里面有什么门道呢?我们都知道linux中的shell是由C语言开发的,因此它底层命令效率是最高的,而方法1中用的是linux内置命令,内置的操作;方法2中使用linux内置函数,效率高也就自然而然了。而方法3和方法4通过管道符,这涉及到类似二次加工,效率肯定也就低了。这下,我们知道了吧,管道符虽然在某些使用场景下很便捷,但是其也有其效率低的缺点,因此不能多用!





审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分