如何在终端输出中筛选无后续依赖行的软件包条目?
在Gentoo中找出无依赖项的已安装软件包
问题场景
执行以下命令可获取所有已安装软件包的依赖信息:
eix-installed -a | xargs equery depends
输出示例如下:
* These packages depend on app-portage/gentoolkit-0.6.5: * These packages depend on app-portage/getuto-1.11: sys-apps/portage-3.0.63 (!build ? app-portage/getuto) * These packages depend on app-portage/portage-utils-0.96.1: app-admin/perl-cleaner-2.31 (!pkgcore ? app-portage/portage-utils)
需要找出像app-portage/gentoolkit-0.6.5这种无依赖项的软件包(条目后无后续依赖行)。
错误原因
你之前尝试的some command | xargs grep -eF "".*""命令报错“File or Directory not found”,核心原因有两点:
xargs会将前序命令的输出当作文件名传递给grep,但grep需要处理的是管道传来的文本内容,而非文件。- 引号使用存在语法错误,导致
grep无法正确解析参数。
解决方案:使用AWK处理输出
AWK擅长处理这种段落式的文本结构,以下命令可直接提取无依赖的软件包:
eix-installed -a | xargs equery depends | awk ' /^\* These packages depend on/ { # 输出上一个无依赖的包 if (current_pkg != "" && !has_deps) { print current_pkg } # 提取当前包名,去掉末尾的冒号 current_pkg = substr($0, 31) sub(/:$/, "", current_pkg) # 默认标记为无依赖 has_deps = 0 next } # 遇到非空行(依赖行),标记为有依赖 NF > 0 { has_deps = 1 } # 处理最后一个包 END { if (current_pkg != "" && !has_deps) { print current_pkg } } '
脚本逻辑解释
- 匹配
* These packages depend on开头的行时:- 检查上一个记录的包是否无依赖,若是则输出。
- 从该行提取软件包名(截取第31个字符开始的内容,去掉末尾的冒号)。
- 初始化标记为无依赖状态。
- 遇到非空行(即存在依赖项的行),将标记改为有依赖。
- 脚本结束时,检查最后一个包是否无依赖,若是则输出。
备选简化方法
如果不需要保留equery depends的原始输出,也可以直接用equery结合qlist实现:
qlist -I | while read pkg; do if equery depends "$pkg" | grep -qE '^\* These packages depend on' && ! equery depends "$pkg" | grep -qE '^[a-z0-9]/'; then echo "$pkg" fi done
这个方法逐个检查每个已安装包的依赖情况,判断是否没有其他包依赖它。
内容的提问来源于stack exchange,提问作者GreninjaShuriken4
相关产品推荐
相关产品推荐

