linux管道符使用方法_linux管道符号_linux管道符

linux管道符_linux管道符使用方法_linux管道符号

作者:zhangqh

一、什么是管道符?

管道符号,是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 "${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.519suser 0m8.606ssys 0m11.374s

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

执行结果2:方法2中linux管道符,通过expr "${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.041suser 0m15.888ssys 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.241suser 0m21.136ssys 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.024suser 0m20.671ssys 0m34.042s

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

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

最近很多小伙伴找我要一些程序员必备资料,于是我翻出了压箱底的宝藏,免费分享给大家!

扫描海报二维码免费获取。

linux管道符号_linux管道符使用方法_linux管道符

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注