以易于解析的格式打印已安装的 Alpine 软件包及其版本列表

以易于解析的格式打印已安装的 Alpine 软件包及其版本列表

我正在尝试以易于处理的格式获取已安装软件包及其版本列表,以便自动化工具进行解析。

我可以得到这个输出:

/ # apk list -i
WARNING: Ignoring APKINDEX.00740ba1.tar.gz: No such file or directory
WARNING: Ignoring APKINDEX.d8b2a6f4.tar.gz: No such file or directory
musl-1.1.22-r2 x86_64 {musl} (MIT) [installed]
zlib-1.2.11-r1 x86_64 {zlib} (zlib) [installed]
apk-tools-2.10.4-r2 x86_64 {apk-tools} (GPL2) [installed]
musl-utils-1.1.22-r2 x86_64 {musl} (MIT BSD GPL2+) [installed]
libssl1.1-1.1.1c-r0 x86_64 {openssl} (OpenSSL) [installed]
alpine-baselayout-3.1.2-r0 x86_64 {alpine-baselayout} (GPL-2.0-only) [installed]
alpine-keys-2.1-r2 x86_64 {alpine-keys} (MIT) [installed]
busybox-1.30.1-r2 x86_64 {busybox} (GPL-2.0) [installed]
scanelf-1.2.3-r0 x86_64 {pax-utils} (GPL-2.0) [installed]
libc-utils-0.7.1-r0 x86_64 {libc-dev} (BSD) [installed]
libtls-standalone-2.9.1-r0 x86_64 {libtls-standalone} (ISC) [installed]
ssl_client-1.30.1-r2 x86_64 {busybox} (GPL-2.0) [installed]
ca-certificates-cacert-20190108-r0 x86_64 {ca-certificates} (MPL-2.0 GPL-2.0-or-later) [installed] 
libcrypto1.1-1.1.1c-r0 x86_64 {openssl} (OpenSSL) [installed]

但是,软件包名称可以包含连字符,并且版本之间用连字符分隔,这使得无法可靠地解析该结果。

有没有办法以更易于解析的格式获取此信息? JSON 很棒,但简单的制表符分隔表也可以。

谢谢!

答案1

但是,软件包名称可以包含连字符,并且版本之间用连字符分隔,这使得无法可靠地解析该结果。

版本本身不能包含连字符 - pkgver 字段始终只有一个组,pkgrel 字段也始终只有一个组。因此,通过分隔最后两个破折号分隔的组;剩下的就是包名称。

大多数编程语言可以使用正则表达式或 .rsplit() / .rindex() 等函数来实现。

例如,此 PCRE 正则表达式将匹配所有字段:

/(.+)-([^-]+)-r([^-]+) (\S+) \{(\S+)\} \((.+?)\)/

要生成类似 JSON 输出的内容,请使用:

apk list -i | perl -MJSON -E 'print encode_json([map {
                                @foo{qw(pkgname pkgver pkgrel arch group license)} =
                                /(.+)-([^-]+)-r([^-]+) (\S+) \{(\S+)\} \((.+?)\)/;
                                \%foo
                              } <>])'

相关内容