優化對稱加密的 shell 腳本

前言

以前一篇文章《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 數據庫。測試

相關文章
相關標籤/搜索