標籤:blog http 使用 strong ar for 檔案 資料 art
最近在寫一個shell指令碼, 由於該指令碼對效率有較高的要求, 所以查閱了一些文章. 感覺這篇文章寫得確實不錯, 文章中的例子,確實很棒! 所
以我把他們提取出來:
@1:執行個體:
需求:計算1到100000累加結果
方法1:採用bash shell的數值計算
# time for((i=0;i<=100000;i++)); do ((sum+=i)); done ; echo $sum
real 0m1.134s
user 0m1.080s
sys 0m0.048s
5000050000
方法2:採用awk的數值計算
# time awk ‘BEGIN{while(i++<100000)sum+=i; printf "%d", sum;}‘
5000050000
real 0m0.029s
user 0m0.020s
sys 0m0.000s
執行個體結果分析:同等的累加運算,採用shell的數值計算耗時1.134秒,採用awk工具只需要0.029秒。實驗結果表明,適當的採用工具軟體,
能夠明顯提高shell指令碼的執行效率。
@2:執行個體: 正則效率。
需求:某文本以空格和/進行分隔,擷取第五列的內容.
方法1:採用正則[ /]分別匹配二種分隔字元,取得第五列
# time awk -F‘[ /]‘ ‘{print $5}‘ a.txt >/dev/null
real 0m17.717s
user 0m14.749s
sys 0m2.844s
方法2:實際資料分析中發現,可以採用單字元解析的方式,首先根據“空格”分隔字元取得第4列,再利用“/”分隔字元取得第二列。
# time awk ‘{print $4}‘ a.txt |awk -F/ ‘{print $2}‘ >/dev/null
real 0m0.565s
user 0m0.224s
sys 0m0.688s
執行個體結果分析:awk採用-F指定分隔字元,在多分隔字元情況下,會啟用正則去解析記錄,增加了函數調用,和字串匹配的消耗,效率上理所
當然的比不上預設的空格或單字元分隔字元採用的簡單的字元比較方式,儘管如此,方法2依賴於對需求的進一步分析,適用的需求範圍沒有
使用正則那麼簡便靈活。
@3:執行個體:sed應用,讀取指定行
方法1:sed -n ‘45,50p‘ filename
方法2:sed -n ‘51q;45,50p‘ filename
執行個體結果分析:方法2在方法1基礎上增加了一個判斷,當檔案讀取到第51行時即時退出。避免檔案後續部分的遍曆,在大資料量處理上能
夠很大的提高執行效率。
@4:執行個體:sed應用,文本替換
方法1:sed ‘s/foo/bar/g‘ filename
方法2:sed ‘/foo/ s/foo/bar/g‘ filename
執行個體結果分析:sed支援採用正則進行匹配和替換,考慮字串替換的需求中,不防加上地址以提高速度。執行個體中通過增加一個判斷邏輯,
採用“事先匹配”代替“直接替換”,由於sed會保留前一次的正則匹配環境,不會產生冗餘的正則匹配,因此方法2具有比方法1更高
的效率
@5:awk的特色資料結構:雜湊數組,也稱關聯陣列。雜湊數組中的每個單元包括二個元素:單元鍵(key)及單元值(values)。雜湊結構
的效益體現在以較小的記憶體空間實現大的資料空間上的資料存放,節省了資料占存空間;同時雜湊數組中的資料訪問是隨機訪問,不需要
遍曆而直接通過雜湊函數直接存取數組單元取值,節省了資料查詢時間。
Reference:
shell指令碼效率: http://blog.csdn.net/yanook/article/details/8395482
Efficiency in Shell