优化对称加密的 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 数据库。

posted @   ZachLim  阅读(282)  评论(1编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示