arch系下如何按大小排序已安装的包?

今天想清理一下 arch 系统下的包,但是不知道如何按照大小排序,就试着研究了一下,权当学习一下 shell 中的常用命令。

首先,我使用 yay 作为包管理器,不过 yay 作为一个 pacman wrapper,自然也可以兼容 pacman 或其他 pacman wrapper 的命令。在此就使用 yay 作为例子。

首先,我们可以使用 yay -Qi 来查看已安装包的相关信息,由于我们只考虑包的大小,因此可以使用 grep -E 'Name|Size' 来筛选出我们需要的信息,不过返回的结果中,一个包的信息占了两行。这实在是浪费,因此我们想要只提取包名与包大小,这就需要使用新学习到的大杀器:awk

awk 是一个极其强大的文本处理工具,它可以将文本按照一定的规则分割成不同的字段,然后对每个字段进行处理。在这里,我们可以使用 awk 将每一行的信息分割成多个字段,然后只提取我们需要的字段,即包名与包大小。简单来说,awk 的使用格式为:

awk [OPTION] [--] '{pattern {action}} file'

其中 pattern 为匹配模式,action 只对 pattern 匹配到的行进行处理。此外,awk 还有一些内置的变量,如 $0 为整行,$1 为第一个字段,$2 为第二个字段,以此类推,awk 还支持简单的过程控制语句,不过在此,我们只需要用到 NF built-in 变量,它表示当前行的字段数。因此,现在我们的代码变成了:yay -Qi | grep -E 'Name|Size' | awk '/Name/{x=$NF}; /Installed Size/{y=$4$NF; print x,y}',在这里,$4$NF 表示将这两个字段 concatenate,这样我们就可以得到每个包的名字与大小了。

现在我们的输出应该形如:yay 9.12MiB,最后一步就是对这些包按照大小进行排序了,这里我们可以使用 sort 命令,sort 的常用排序规则有按字典序排序(默认情况)、按数值大小排序(-n)、按照人类可读的大小排序(-h),因此,我们的最终命令就变成了:yay -Qi | grep -E 'Name|Size' | awk '/Name/{x=$NF}; /Installed Size/{y=$4$NF; print x,y}' | sort -hr -k2。这里的 -r 表示倒序,-k2 表示按照第二个字段进行排序。

好吧,其实打印出来的效果不太美观,因此我们可以使用 column 命令来对齐输出,我们使用 column -t 让其对源输入作为表格进行对齐,因此,最终的命令就变成了:yay -Qi | grep -E 'Name|Size' | awk '/Name/{x=$NF}; /Installed Size/{y=$4$NF; print x,y}' | sort -hr -k2 | column -t

在最后,我们 benchmark 一下这个命令的执行时间,使用 perf stat -r 10 sh -c "yay -Qi | grep -E 'Name|Size' | awk '/Name/{x=\$NF}; /Installed Size/{y=\$4\$NF; print x,y}' | sort -hr -k2 | column -t > /dev/null",结果如下:benchmark

Last modification:December 24, 2023