解析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
相关产品推荐
相关产品推荐

