以前一篇文章《shell 腳本實現文件對稱加密》中,講述瞭如何用 shell 腳本實現對稱加密。html
以後寫管理密碼腳本時,發覺該腳本的處理速度很是慢,而其緣由就在 shell 的處理命令上,而將其中的循環亦或運算改用 awk 處理便可,下面記錄須要注意的地方。git
筆者使用的 awk 版本不支持 xor()
即內置亦或運算函數,因此必須本身編寫亦或運算,下面爲亦或運算的實現。github
function xor(l, r) { ret = 0; bit = 0; while (l != 0 && r != 0) { t = ((l % 2) == (r % 2)) ? 0 : 1; ret = ret + (2^bit)*t; l = int(l / 2); r = int(r / 2); bit++; } while (l != 0) { t = ((l % 2) == 0) ? 0 : 1; ret = ret + (2^bit)*t; l = int(l / 2); bit++; } while (r != 0) { t = ((r % 2) == 0) ? 0 : 1; ret = ret + (2^bit)*t; r = int(r / 2); bit++; } return ret; }
可是手機上的 awk 版本還不支持自定義函數,無奈只能將這段函數裏的代碼放到主過程上。shell
shell 中往 awk 腳本傳遞數據能夠用 -v "var=value"
方法,可是當數據量過大時就只能用管道傳遞,不然會報 Argument list too long
的錯誤,下面是一個示範例子。數據庫
# variable 'data' contains a lot of data echo -ne "${data}"|awk ' BEGIN { print($0); # print data } '
對一個 1395351 字節(約爲 1.4M )大小的文件,用新的腳本測試結果以下:ssh
3.24s user 0.10s system 102% cpu 3.244 total
而用舊的腳本跑了 20 分鐘都還未處理完成,可見其速度上的差距。函數
對於 awk 的語法還有 shell 腳本優化等,還有不少須要學習的地方。學習
密碼管理腳本在筆者的 Github 上,該腳本基本實現了一個小型 key-value 數據庫,有空會單獨分離出來實現一個功能更完整的 key-value 數據庫。測試