如何将systemctl --type=service输出格式化为CSV文件?
解决systemctl服务状态转CSV的问题
方法一:直接处理systemctl默认输出(awk)
针对列分割时拆分Description内容的问题,awk可以精准提取前四列,将剩余内容合并为Description字段并添加引号,避免内容被拆分:
systemctl --type=service | awk ' BEGIN {OFS=","; print "Unit,Load,Active,SUB,Description"} NR>1 { desc = substr($0, index($0, $5)) gsub(/"/, "\"\"", desc) # 转义字段内的双引号,符合CSV规范 print $1, $2, $3, $4, "\"" desc "\"" } '
如果只需要**运行中(active running)**的服务,添加过滤条件:
systemctl --type=service | awk ' BEGIN {OFS=","; print "Unit,Load,Active,SUB,Description"} NR>1 && $3=="active" && $4=="running" { desc = substr($0, index($0, $5)) gsub(/"/, "\"\"", desc) print $1, $2, $3, $4, "\"" desc "\"" } '
方法二:利用systemctl JSON输出(更可靠)
systemctl支持直接输出JSON格式,搭配jq工具可以更精准地生成CSV,完全避免列对齐问题:
systemctl --type=service --json=short | jq -r ' ["Unit", "Load", "Active", "SUB", "Description"], (.[] | [.unit, .load, .active, .sub, .description]) | @csv '
过滤运行中服务的版本:
systemctl --type=service --json=short | jq -r ' ["Unit", "Load", "Active", "SUB", "Description"], (.[] | select(.active=="active" and .sub=="running") | [.unit, .load, .active, .sub, .description]) | @csv '
注:如果系统没有
jq,可以用包管理器安装(如apt install jq或yum install jq)。
内容的提问来源于stack exchange,提问作者Magicfades
相关产品推荐
相关产品推荐

