今天浩道跟大家分享Linux知識(shí)中常用到的管道符,通過一些實(shí)例讓你知道它存在的一些弊端,讓你在某些場(chǎng)景下知道使用管道符的便捷之處!以及為什么要少用管道符?。。?/p>
一、什么是管道符?
管道符號(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é)果,通過管道符|,傳給后一個(gè)命令wc -l,作為wc -l命令的執(zhí)行對(duì)象。
即上述兩個(gè)命令結(jié)合管道符完成對(duì)test.txt文件的行數(shù)統(tǒng)計(jì)。
二、使用管道符的便捷之處
通過上述簡(jiǎn)單例子,我們應(yīng)該可以看出使用管道符確實(shí)有它便捷的地方。以下羅列幾個(gè),讓大家加深對(duì)于管道符使用的便捷之處。
例子1:通過shell分析,查看2023年4月1日14時(shí)這一個(gè)小時(shí)內(nèi)有多少IP訪問網(wǎng)站;
awk '{print $4,$1}' log_file | grep 01/Apr/2023:14 | awk '{print $2}'| sort | uniq | wc -l
例子2:通過shell分析網(wǎng)站日志,查看有多少個(gè)IP訪問?
awk '{print $1}' log_file|sort|uniq|wc -l
三、為什么要少用管道符?
這個(gè)才是我們本文講解的重點(diǎn),也是作為一個(gè)高級(jí)linux運(yùn)維人員所要知道的,為什么要少用管道符?并不是說方便就可以大量使用,我們需要考慮到其執(zhí)行的速度及效率,下面一起通過實(shí)例看看管道符要少用的原因!
實(shí)例:通過多種統(tǒng)計(jì)字符串長(zhǎng)度命令的執(zhí)行效率進(jìn)行對(duì)比,得出管道符要少用的具體原因!
(一)統(tǒng)計(jì)字符串長(zhǎng)度的命令有哪些?以下舉例4個(gè)方法。
方法1:通過echo ${#str1}?命令進(jìn)行統(tǒng)計(jì),其中str1為自定義字符串變量。
方法2:通過expr length "${str1}"命令進(jìn)行統(tǒng)計(jì),其中str1為自定義字符串變量。
方法3:通過echo命令,結(jié)合管道符,以及awk命令實(shí)現(xiàn),如下命令:
echo?"${str1}"?|?awk?'{print?length($0)}'
其中str1為自定義字符串變量。
方法4:通過echo命令,結(jié)合管道符,以及wc命令實(shí)現(xiàn),如下命令:
echo ${#str1} |wc -L
其中str1為自定義字符串變量。
(二)以上4種統(tǒng)計(jì)字符串長(zhǎng)度的方法命令,哪一種效率最高,即速度最快?
以下先通過seq相關(guān)命令來生成相關(guān)的字符串長(zhǎng)度。然后通過for循環(huán)執(zhí)行來控制字符串生成次數(shù)的情況下,最后再通過time命令統(tǒng)計(jì)整個(gè)命令的執(zhí)行時(shí)間,通過同等循環(huán)條件下,不同命令,結(jié)合直觀的運(yùn)行時(shí)間進(jìn)行比較,得出效率最高的方法。
執(zhí)行結(jié)果1:方法1中,通過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
通過上述命令執(zhí)行結(jié)果看出,該方法1耗時(shí)為19.519秒左右;
執(zhí)行結(jié)果2:方法2中,通過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
通過上述命令執(zhí)行結(jié)果看出,該方法1耗時(shí)為36.041秒左右;
執(zhí)行結(jié)果3:方法3中,通過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
通過上述命令執(zhí)行結(jié)果看出,該方法1耗時(shí)為45.241秒左右;
執(zhí)行結(jié)果4:方法4中,通過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
通過上述命令執(zhí)行結(jié)果看出,該方法1耗時(shí)為43.024秒左右;
結(jié)語:通過以上4種方法執(zhí)行結(jié)果,我們很清楚得出方法1所耗時(shí)最少,效率最高。方法2次之;方法3和方法4中都結(jié)合了管道符的使用,耗時(shí)最多,效率最低。這里面有什么門道呢?我們都知道linux中的shell是由C語言開發(fā)的,因此它底層命令效率是最高的,而方法1中用的是linux內(nèi)置命令,內(nèi)置的操作;方法2中使用linux內(nèi)置函數(shù),效率高也就自然而然了。而方法3和方法4通過管道符,這涉及到類似二次加工,效率肯定也就低了。這下,我們知道了吧,管道符雖然在某些使用場(chǎng)景下很便捷,但是其也有其效率低的缺點(diǎn),因此不能多用!
編輯:黃飛
?
評(píng)論
查看更多