You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解析sed命令并修正systemctl服务状态JSON输出冗余问题

问题解决与原有命令解析

原有sed命令逐段解析

把你贴的sed命令拆成独立操作逐个说明:

  • s/\.service\s+/\",\"{#STATUS}\":\"/:匹配.service后跟一个或多个空白字符,将其替换为","{#STATUS}":",作用是把服务名和后续状态的分隔符改成JSON键值对格式。
  • s/(\s+)?$/\"},/:匹配行尾零个或多个空白字符,替换为"},,给每个服务的JSON对象加上闭合尾巴,方便后续组成数组。
  • s/^/{\"{#NAME}\":\"/:在行开头添加"{"{#NAME}":",给服务名配上对应的JSON键名。
  • $ s/.$//:仅对最后一行生效,去掉最后一个字符——因为前面的操作会给最后一行也加},,这一步把它改成},保证整个JSON数组格式合法。

修正后的命令

问题根源是systemctl list-unit-files默认输出包含服务名、状态、厂商预设三列,原有sed把.service后面的所有内容都塞进了{#STATUS},导致出现冗余值。我们只需要在sed里提取第一个状态值即可,修正后的命令如下:

echo "{\"data\":[$(systemctl list-unit-files --type=service | grep .service | grep -v "@" | sed -E -e "s/\.service\s+(\S+)\s+.*/\",\"{#STATUS}\":\"$1\"/;s/(\s+)?$/\"},/;s/^/{\"{#NAME}\":\"/;$ s/.$//")]}"

关键修改点

把原来的第一个sed替换命令改成了s/\.service\s+(\S+)\s+.*/\",\"{#STATUS}\":\"$1\"/:

  • \S+匹配第一个状态值(比如enabled),用括号捕获为$1
  • \s+.*匹配状态值后面的所有内容(包括厂商预设和空白),直接替换掉,只保留捕获的第一个状态值

这样输出的{#STATUS}就只会显示单个状态值,不会带上厂商预设的冗余内容。

内容的提问来源于stack exchange,提问作者Eddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:09:21