获取 Homebrew 中每个已安装公式的版本?

har*_*shn 4 macos homebrew

我们正在尝试获取每个已安装软件包的版本。

任何人都可以帮忙提供像这样打印的brew 命令吗?

Name            Installed     Latest
ant               1.9.4        1.9.4
maven             3.6.3        3.6.3
mariadb@10.2      10.2.31.     10.2.37
node              v12.1.0      v14.0
Run Code Online (Sandbox Code Playgroud)

这是尝试过的命令:

brew list --formula | xargs -n1 -P8 -I {} sh -c "brew info {}| egrep '[0-9]* stable'|sed -e 's/stable//g' -e 's/HEAD//g' -e 's/(bottled)//g' -e 's/,//g' -e 's/\[keg-only\]//g' -e 's/://g'"|egrep 'node|maven|ant|mariadb'|grep -v "Warning"|column -t
Run Code Online (Sandbox Code Playgroud)

我只得到这个:

ant      1.10.9
maven    3.6.3
node     15.12.0
node@14  14.16.0
Run Code Online (Sandbox Code Playgroud)

需要有关如何从公共检索最新版本并追加的建议吗?

axi*_*iac 6

使用--json选项brew info获取 JSON 格式的公式信息,并使用jq从中提取版本。grep它比使用或aws其他面向线路的工具更安全、更容易。

如果尚未安装,请用于brew install jq安装:-)jq

brew list --formulae |
xargs brew info --json |
jq -r '
    ["name", "latest", "installed version(s)"],
    (.[] | [ .name, .versions.stable, (.installed[] | .version) ])
    | @tsv
'
Run Code Online (Sandbox Code Playgroud)

上面的命令列出了所有已安装的公式,将它们的名称传递给,brew info然后从 生成的 JSON 输出中提取所需的信息brew info --json

它生成一个制表符分隔值的列表,其中包含以下列:namelatestinstalled versions(s)。交换列的顺序是因为本地可能安装多个版本的公式。发生这种情况时,已安装的版本会在单独的列中生成,从第 3 列开始。

输出可以重定向到文件,然后导入到 MS Excel/OpenOffice/LibreOffice/Google Sheets 中,或者可以使用简单的 shell 命令( 等)自动cut处理grep

剧本jq

(
  ["name", "latest", "installed version(s)"]
  ,
  (.[] | [ .name, .versions.stable, (.installed[] | .version) ])
)
| @tsv
Run Code Online (Sandbox Code Playgroud)

此处列出的 JQ 脚本的第一和第五(括号)未出现在完整的命令行中,因为实际上并不需要它们。它们在这里出于解释目的而出现,但 JQ 运算符的优先级确保即使没有它们也能正确执行。

第二行生成一个数组其中包含此处显示的三个字符串文字;它们代表最终输出的第一行(标题)。它不使用输入数据。

第三行的逗号将输入数据发送到第一个过滤器(第 2 行),然后发送到第二个过滤器(第 4 行),然后连接它们的输出。

第 4迭代输入数组(输出brew info是对象数组),并将每个项目 ( |) 发送到后续过滤器name,该过滤器提取字段versions.stable(并version从数组的所有值中提取字段installed)到数组中[ ... ]。它为每个公式生成一个包含三个或更多条目的数组。

第一行和第五行括号对上述过滤器的输出进行分组,并将结果 ( |) 传递到下一个过滤器。

@tsv第 6 行的运算符上面生成的每个数组转换为包含用逗号分隔的值的字符串。

JQ 命令行中-r的 告诉它生成原始输出。这意味着,如果可能的话,不生成 JSON,而是生成纯文本。如果没有它,脚本的输出就是每个公式编码为 JSON 的值(fe"jq\t1.6\t1.6"字面意思)。使用它,输出只是字符串的值,没有任何编码、转义或其他 JSON 约定。

如果安装了公式的多个版本,则脚本会在其行上生成 4 个或更多值。第三个及其后的值是本地安装的版本。

免责声明

我没有测试安装了多个版本的公式的脚本,我希望它能按描述的那样工作。我没有任何公式的多个版本,我不知道现在是否仍然可以安装公式的多个版本。过去是可能的,brew list如果可以的话,可以显示它们。赶紧跑brew list --multiple --versions