0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_TEuU2tls 来源:浩道linux 2023-06-28 09:12 次阅读

一、什么是管道符?

管道符号,是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'{printlength($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通过管道符,这涉及到类似二次加工,效率肯定也就低了。这下,我们知道了吧,管道符虽然在某些使用场景下很便捷,但是其也有其效率低的缺点,因此不能多用!





审核编辑:刘清

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

    关注

    87

    文章

    11191

    浏览量

    208622
  • C语言
    +关注

    关注

    180

    文章

    7588

    浏览量

    135734

原文标题:切记!Linux管道符不是你想用就能乱用的!

文章出处:【微信号:浩道linux,微信公众号:浩道linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux匿名管道和命名管道的区别

    管道是 UNIX系统 IPC的最古老的形式,所有的UNIX系统都提供此种通信。所谓的管道,也就是内核里面的一串缓存,从管道的一段写入的数据,实际上是缓存在内核中的,令一端读取,也就是从内核中读取这段
    发表于 10-12 12:50 965次阅读

    [9.6]--管道符_clip001

    Linux
    jf_90840116
    发布于 :2023年02月19日 21:04:47

    [9.6]--管道符_clip002

    Linux
    jf_90840116
    发布于 :2023年02月19日 21:05:31

    Linux下进程间通信方式-管道

    Linux下进程间通信方式-管道分享到: 本文关键字: linux 管道通信,linux 进程通信方式 ,无名
    发表于 08-29 15:29

    标准流管道

    华清远见嵌入式linux学习资料《标准流管道》,1.标准流管道函数说明 。与Linux的文件操作中有基于文件流的标准I/O操作一样,管道的操
    发表于 09-09 14:13

    接地磁珠不要乱用

    开关电源的相关知识学习教材资料——接地磁珠不要乱用
    发表于 09-20 16:10 0次下载

    Linux系统管道和有名管道的通信机制解析

    Linux 进程间通信的几种主要手段。其中管道和有名管道是最早的进程间通信机制之一,管道可用于具有亲缘关系进程间的通信,有名管道克服了
    发表于 11-07 10:51 0次下载

    Linux中的管道和命名管道介绍

    Linux 中,pipe 能让你将一个命令的输出发送给另一个命令。管道,如它的名称那样,能重定向一个进程的标准输出、输入和错误到另一个进程,以便于进一步处理。
    的头像 发表于 09-23 10:33 3982次阅读
    <b class='flag-5'>Linux</b>中的<b class='flag-5'>管道</b>和命名<b class='flag-5'>管道</b>介绍

    管道数据流"实时性" 和使用小提示

    相信很多在linux平台工作的童鞋, 都很熟悉管道符 '|', 通过它, 我们能够很灵活的将几种不同的命令协同起来完成一件任务
    的头像 发表于 08-09 17:36 3070次阅读

    Linux进程间通信方式——管道

    管道Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入。Linux管道主要包括两种:无名管道和有名
    发表于 06-01 09:13 1365次阅读
    <b class='flag-5'>Linux</b>进程间通信方式——<b class='flag-5'>管道</b>

    Linux进程间通信方法之管道

    上文中我们介绍了进程间通信的方法之一:信号,本文将继续介绍另一种进程间通信的方法,即管道管道Linux中使用shell经常用到的一个技术,本文将深入剖析管道的实现和运行逻辑。
    的头像 发表于 05-14 15:47 1914次阅读
    <b class='flag-5'>Linux</b>进程间通信方法之<b class='flag-5'>管道</b>

    Linux系统用户与用户组管理

    看到上面那条命令,你是不是有点不知所以呢?其实,head前面的符号|,我们称为管道符,它的作用是把前面的命令的输出再输入给后面的命令。管道符在第11章中还会介绍,阿铭用得也是蛮多的,请掌握它的用法。
    的头像 发表于 10-20 09:19 773次阅读

    linux管道符的使用

    大家好,这里是浩道linux,主要给大家分享linux、python、网络通信相关的IT知识平台。
    的头像 发表于 04-11 11:11 4170次阅读

    linux知识中常用到的管道符号有哪些

    作为一个高级linux运维人员所要知道的,为什么要少用管道符?并不是说方便就可以大量使用,我们需要考虑到其执行的速度及效率,下面一起通过实例看看管道符要少用的原因!
    发表于 09-29 07:00 1997次阅读

    linux管道概述

    一、进程间通信(IPC)介绍 进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。 IPC的方式通常有管道(包括无名管道和命名管道)、消息队列
    的头像 发表于 02-18 14:51 455次阅读
    <b class='flag-5'>linux</b><b class='flag-5'>管道</b>概述