电子说
一、什么是管道符?
管道符号,是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通过管道符,这涉及到类似二次加工,效率肯定也就低了。这下,我们知道了吧,管道符虽然在某些使用场景下很便捷,但是其也有其效率低的缺点,因此不能多用!
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !