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