推荐用 systemctl list-unit-files --type=service --no-legend --no-pager | awk '$1 ~ /\.service$/ {print $1, $2}' | sort 导出所有 .service 单元的开机自启状态并排序,结果可保存为 TSV 文件用于统计与核查。

要精准导出当前服务器所有存量服务的开机自启状态(即 enabled、disabled、static、masked 等)为结构化表格,推荐用 systemctl list-unit-files --type=service 配合字段提取与格式化,而非依赖默认输出(含分页、对齐不一致、含提示行等干扰)。
只取关键两列:服务名 + 自启状态
默认输出包含“UNIT FILE”和“STATE”两列,但首行是表头、末尾可能有分页提示。需过滤掉非数据行,并确保字段严格对齐或按空格/制表符切分:
systemctl list-unit-files --type=service --no-legend --no-pager | awk '{print $1, $2}' | sort
-
--no-legend:去掉首行表头(如 "UNIT FILE STATE") -
--no-pager:避免被less截断,保证全量输出到管道 -
awk '{print $1, $2}':取第一列(服务名)和第二列(状态),规避中间可能存在的空格服务名(极少见,但真实存在如myapp@.service是合法的;而带空格的 service 名需用systemctl list-unit-files --full或 JSON 模式) -
sort:让结果按字母序排列,便于人工核对或后续 diff
导出为 CSV 格式(兼容 Excel / 表格工具)
若需导入 Excel 或做进一步分析,生成带引号、逗号分隔的 CSV 更稳妥:
systemctl list-unit-files --type=service --no-legend --no-pager | awk -F'[[:space:]]+' '{printf ""%s","%s"
", $1, $2}' | sort
-
-F'[[:space:]]+':以一个或多个空白字符为字段分隔符,更鲁棒地处理多空格对齐 -
printf ""%s","%s" ":给每列加英文双引号,防止服务名含逗号时解析错乱
排除非 .service 后缀的伪服务(可选增强)
极少数系统会混入 .socket、.target 等(尽管指定了 --type=service,但旧版 systemd 可能不严格)。为彻底只留 .service 单元,加一行过滤:
systemctl list-unit-files --type=service --no-legend --no-pager | awk '$1 ~ /.service$/ {print $1, $2}' | sort
- 确保只保留以
.service结尾的单元名,排除foo.socket或bar.target的误匹配 - 注意:该过滤不会影响
foo@.service或foo@bar.service,它们也符合正则
保存为文件并验证有效性
导出后建议保存为文本文件,并快速检查行数与实际服务数量是否合理:
systemctl list-unit-files --type=service --no-legend --no-pager | awk '$1 ~ /.service$/ {print $1, $2}' | sort > /tmp/service-autostart-status.tsv
- 用
.tsv(制表符分隔)比.csv更简单安全,避免引号转义问题 - 执行后可用
wc -l /tmp/service-autostart-status.tsv查看总服务数;再用grep enabled /tmp/service-autostart-status.tsv | wc -l统计开机自启项 - 打开文件确认无乱码、无截断、无空行


















