如何在Linux中获取运行状态的服务并输出其版本信息?
在Linux中用Bash获取运行中服务及其版本的简便方法
不需要Python脚本,用纯Bash命令就能快速实现需求,下面是几种不同输出格式的实现方案:
表格格式输出(对齐易读)
这是最直观的输出方式,会自动对齐服务名和版本:
systemctl list-units -t service --state=active --plain --no-legend --no-page | awk '{print $1}' | while read -r service; do # 去掉服务名的.service后缀,大部分服务对应包名和服务名一致 pkg="${service%.service}" # 查询版本,无对应包时输出N/A version=$(rpm -q "$pkg" 2>/dev/null || echo "N/A") # 格式化对齐,服务名占20字符宽度 printf "%-20s %s\n" "$service" "$version" done
CSV格式输出(适合导入表格工具)
如果需要导出到Excel或其他数据分析工具,用CSV格式更方便:
# 输出表头 echo "Service,Version" systemctl list-units -t service --state=active --plain --no-legend --no-page | awk '{print $1}' | while read -r service; do pkg="${service%.service}" version=$(rpm -q "$pkg" 2>/dev/null || echo "N/A") # 用双引号包裹内容,避免版本中的逗号破坏格式 printf "\"%s\",\"%s\"\n" "$service" "$version" done
JSON格式输出(适合程序处理)
如果需要后续用脚本解析,JSON格式更规范,需要提前安装jq工具(yum install jq或apt install jq):
systemctl list-units -t service --state=active --plain --no-legend --no-page | awk '{print $1}' | while read -r service; do pkg="${service%.service}" version=$(rpm -q "$pkg" 2>/dev/null || echo "N/A") # 输出单个JSON对象 printf '{"service": "%s", "version": "%s"}\n' "$service" "$version" done | jq -s '.' # 合并为JSON数组
注意事项
- 少数服务的包名和服务名不一致(比如
network.service对应包network-scripts),遇到这种情况可以在循环中添加case判断手动映射:case "$pkg" in network) pkg="network-scripts";; # 添加更多特殊映射规则 esac - 如果是Debian/Ubuntu系统,需要把
rpm -q换成dpkg -l | grep -E "^ii $pkg " | awk '{print $3}'来查询版本。
内容的提问来源于stack exchange,提问作者takobaba
相关产品推荐
相关产品推荐

