优化对称加密的 shell 脚本

前言

之前一篇文章《shell 脚本实现文件对称加密》中,讲述了如何用 shell 脚本实现对称加密。

之后写管理密码脚本时,发觉该脚本的处理速度非常慢,而其原因就在 shell 的处理命令上,而将其中的循环亦或运算改用 awk 处理即可,下面记录需要注意的地方。

亦或运算及函数

笔者使用的 awk 版本不支持 xor() 即内置亦或运算函数,所以必须自己编写亦或运算,下面为亦或运算的实现。

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 中往 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 )大小的文件,用新的脚本测试结果如下:

3.24s user
0.10s system
102% cpu
3.244 total

而用旧的脚本跑了 20 分钟都还未处理完成,可见其速度上的差距。

后话

对于 awk 的语法还有 shell 脚本优化等,还有很多需要学习的地方。

密码管理脚本在笔者的 Github 上,该脚本基本实现了一个小型 key-value 数据库,有空会单独分离出来实现一个功能更完整的 key-value 数据库。

猜你喜欢

转载自www.cnblogs.com/linzhehuang/p/10800122.html
今日推荐