一、什么是管道符?
管道符號(hào),是unix一個(gè)很強(qiáng)大的功能,符號(hào)為一條豎線:"|"。
用法:命令 1 | 命令 2
功能是把第一個(gè)命令,即命令 1執(zhí)行的結(jié)果作為命令 2的輸入傳給命令 2
例如命令:
cat test.txt | wc -l
命令功能拆解:
cat test.txt命令功能是打印test.txt文件內(nèi)容(行數(shù))。
wc -l命令完成行數(shù)統(tǒng)計(jì)。
整個(gè)命令功能就是將cat test.txt的執(zhí)行結(jié)果,通過(guò)管道符|,傳給后一個(gè)命令wc -l,作為wc -l命令的執(zhí)行對(duì)象。
即上述兩個(gè)命令結(jié)合管道符完成對(duì)test.txt文件的行數(shù)統(tǒng)計(jì)。
二、使用管道符的便捷之處
通過(guò)上述簡(jiǎn)單例子,我們應(yīng)該可以看出使用管道符確實(shí)有它便捷的地方。以下羅列幾個(gè),讓大家加深對(duì)于管道符使用的便捷之處。
例子1:通過(guò)shell分析,查看2023年4月1日14時(shí)這一個(gè)小時(shí)內(nèi)有多少IP訪問(wèn)網(wǎng)站;
awk '{print $4,$1}' log_file | grep 01/Apr/2023:14 | awk '{print $2}'| sort | uniq | wc -l
例子2:通過(guò)shell分析網(wǎng)站日志,查看有多少個(gè)IP訪問(wèn)?
awk '{print $1}' log_file|sort|uniq|wc -l
三、為什么要少用管道符?
這個(gè)才是我們本文講解的重點(diǎn),也是作為一個(gè)高級(jí)linux運(yùn)維人員所要知道的,為什么要少用管道符?并不是說(shuō)方便就可以大量使用,我們需要考慮到其執(zhí)行的速度及效率,下面一起通過(guò)實(shí)例看看管道符要少用的原因!
實(shí)例:通過(guò)多種統(tǒng)計(jì)字符串長(zhǎng)度命令的執(zhí)行效率進(jìn)行對(duì)比,得出管道符要少用的具體原因!
(一)統(tǒng)計(jì)字符串長(zhǎng)度的命令有哪些?以下舉例4個(gè)方法。
方法1:通過(guò)echo ${#str1}命令進(jìn)行統(tǒng)計(jì),其中str1為自定義字符串變量。
方法2:通過(guò)expr length "${str1}"命令進(jìn)行統(tǒng)計(jì),其中str1為自定義字符串變量。
方法3:通過(guò)echo命令,結(jié)合管道符,以及awk命令實(shí)現(xiàn),如下命令:
echo"${str1}"|awk'{printlength($0)}'
其中str1為自定義字符串變量。
方法4:通過(guò)echo命令,結(jié)合管道符,以及wc命令實(shí)現(xiàn),如下命令:
echo ${#str1} |wc -L
其中str1為自定義字符串變量。
(二)以上4種統(tǒng)計(jì)字符串長(zhǎng)度的方法命令,哪一種效率最高,即速度最快?
以下先通過(guò)seq相關(guān)命令來(lái)生成相關(guān)的字符串長(zhǎng)度。然后通過(guò)for循環(huán)執(zhí)行來(lái)控制字符串生成次數(shù)的情況下,最后再通過(guò)time命令統(tǒng)計(jì)整個(gè)命令的執(zhí)行時(shí)間,通過(guò)同等循環(huán)條件下,不同命令,結(jié)合直觀的運(yùn)行時(shí)間進(jìn)行比較,得出效率最高的方法。
執(zhí)行結(jié)果1:方法1中,通過(guò)echo ${#str1}命令進(jìn)行統(tǒng)計(jì),具體命令如下:
time for i in {1..10000};do str1=`seq -s "haodao" 100`;echo ${#str1} &> /dev/null;done
命令執(zhí)行結(jié)果,所耗時(shí)間如下:
[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
通過(guò)上述命令執(zhí)行結(jié)果看出,該方法1耗時(shí)為19.519秒左右;
執(zhí)行結(jié)果2:方法2中,通過(guò)expr length "${str1}"命令進(jìn)行統(tǒng)計(jì),具體命令如下:
time for i in {1..10000};do str1=`seq -s "haodao" 100`;expr length "${str1}" &> /dev/null;done
命令執(zhí)行結(jié)果,所耗時(shí)間如下:
[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
通過(guò)上述命令執(zhí)行結(jié)果看出,該方法1耗時(shí)為36.041秒左右;
執(zhí)行結(jié)果3:方法3中,通過(guò)echo命令,結(jié)合管道符,以及awk命令實(shí)現(xiàn)進(jìn)行統(tǒng)計(jì),具體命令如下:
time for i in {1..10000};do str1=`seq -s "haodao" 100`;echo "${str1}" | awk '{print length($0)}' &> /dev/null;done
命令執(zhí)行結(jié)果,所耗時(shí)間如下:
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
通過(guò)上述命令執(zhí)行結(jié)果看出,該方法1耗時(shí)為45.241秒左右;
執(zhí)行結(jié)果4:方法4中,通過(guò)echo命令,結(jié)合管道符,以及wc命令實(shí)現(xiàn)進(jìn)行統(tǒng)計(jì),具體命令如下:
time for i in {1..10000};do str1=`seq -s "haodao" 100`;echo ${#str1} |wc -L &> /dev/null;done
命令執(zhí)行結(jié)果,所耗時(shí)間如下:
[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
通過(guò)上述命令執(zhí)行結(jié)果看出,該方法1耗時(shí)為43.024秒左右;
結(jié)語(yǔ):通過(guò)以上4種方法執(zhí)行結(jié)果,我們很清楚得出方法1所耗時(shí)最少,效率最高。方法2次之;方法3和方法4中都結(jié)合了管道符的使用,耗時(shí)最多,效率最低。這里面有什么門道呢?我們都知道linux中的shell是由C語(yǔ)言開發(fā)的,因此它底層命令效率是最高的,而方法1中用的是linux內(nèi)置命令,內(nèi)置的操作;方法2中使用linux內(nèi)置函數(shù),效率高也就自然而然了。而方法3和方法4通過(guò)管道符,這涉及到類似二次加工,效率肯定也就低了。這下,我們知道了吧,管道符雖然在某些使用場(chǎng)景下很便捷,但是其也有其效率低的缺點(diǎn),因此不能多用!
審核編輯:劉清
-
Linux
+關(guān)注
關(guān)注
87文章
11312瀏覽量
209738 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7605瀏覽量
137020
原文標(biāo)題:切記!Linux管道符不是你想用就能亂用的!
文章出處:【微信號(hào):浩道linux,微信公眾號(hào):浩道linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論