AWK 在 Debian 11 上的表现与 Debian 10 有差异

在Linux环境下,AWK是一种强大的文本处理工具,被广泛应用于数据处理和文本分析。然而,在不同的Linux发行版中,我们可能会遇到不同的AWK实现,其中两个主要的是mawk和gawk。其中Debian 11从 gawk 改为了 mawk。我的脚本在 Debian 11 中也出现了一些问题。

AWK简介

AWK 是一种用于处理文本数据的编程语言,通常用于按行处理结构化文本文件。它由Alfred Aho、Peter Weinberger和Brian Kernighan于1977年开发,其名称来源于他们的姓氏首字母。AWK通过执行一系列的模式匹配和动作来对文本进行处理。

mawk与gawk的差异

mawk(Mike’s AWK)和gawk(GNU AWK)是两种不同的AWK实现,它们在性能、特性和兼容性方面有着不同的特点。

性能

mawk被设计成一个轻量级的AWK实现,注重于速度和资源效率。其代码库较小,可能更容易维护。

相比之下,gawk是一个功能更丰富的实现,提供了更多高级功能和选项,但可能在性能上有所开销。在某些情况下,mawk可能比gawk更快。

特性和兼容性

gawk实现了POSIX和大部分AWK的标准,并提供了许多扩展功能。这使得gawk在处理复杂任务时更为方便。

而mawk更注重于遵循标准,可能在某些gawk的扩展功能方面有所不同。

示例:mawk与gawk在命令行上的差异

在不同的AWK实现中,即使是相同的命令,也可能产生不同的结果。比如,下面这个例子:

echo "nginx.kelu.org" | awk '{split($0,arr,"."); tmp=0; for(i in arr) tmp=i; for(j=tmp; j>0;j--) printf("%s/",arr[j]); }'

在Debian 11上输出为 “nginx”,而在Debian 10上输出为 “org/kelu/nginx”。这种差异可能是由于mawk和gawk在数组遍历时的行为不同所导致的,以下解释来自 gpt,我并未验证,谨慎接受:

1. 数组遍历顺序:

在AWK中,数组的遍历顺序并不总是与元素添加的顺序一致。而在mawk和gawk中,对于 for (i in array) 的遍历,遍历顺序可能有所不同。

  • mawk: mawk的数组遍历顺序可能是未定义的。
  • gawk: gawk通常会按照元素添加的顺序遍历数组。

2. 数组索引:

在AWK中,数组的索引通常是整数或者字符串。在您的例子中,您使用 split() 函数将字符串分割成数组,并且使用数组的索引来访问元素。

  • mawk: mawk可能对数组索引的处理有所不同,可能更加严格,不允许将字符串作为索引?
  • gawk: gawk在处理数组索引时可能更加宽松,允许字符串作为索引。这意味使用 for (i in array) 遍历数组时,索引可能是字符串类型。

切换 Debian 11 使用 gwak

  1. 安装 gawk:首先,确保系统已经安装了 gawk

    sudo apt-get update
    sudo apt-get install gawk
    
  2. 更新 alternatives 系统:Debian 使用 alternatives 系统来管理多版本的程序。你可以将 awk 的默认实现更改为 gawk

    首先,检查当前 awk 使用的是哪个实现:

    update-alternatives --display awk
    

    image-20240607下午50036169

    发现已经默认使用gawk了。如果不是,可以这么设置:

    sudo update-alternatives --set awk /usr/bin/gawk
    
  3. 验证更改:最后,确认 awk 已经切换到 gawk

    awk --version
    

    输出应该显示 gawk 版本信息。

    image-20240607下午52030201


使用 systemd override 自定义服务配置,修改 systemd 服务依赖顺序 nginx 在图片请求出现 404 时返回自定义默认图片的方法