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

如何使用awk去掉systemctl查询结果中服务名的.service后缀

问题解决方法

首先说明之前写法失效的原因:

  • substr($i, 0, -8)不符合awk语法:awk的字符串索引从1开始计数,且substr不支持负长度参数,无法直接用负数表示从末尾截断。
  • ${1:-8}是bash的参数展开语法,写在awk的单引号包裹的代码块中时,代码块内容完全由awk解析,bash不会提前做变量展开,因此不会生效。

实现方案

你可以选择以下任意一种方法修改f_status函数中的awk逻辑即可:

方案1:替换后缀(更稳妥,避免服务名长度异常时截断错误)

用awk的sub函数直接删除末尾的.service后缀:

f_status () {
        systemctl list-units | grep $1 | awk '{ sub(/\.service$/, "", $1); printf("SERVICE STATUS:  %-25s \t %s \t %s \t %s\n",$1,$2,$3,$4) }'
}

方案2:按长度截断末尾8个字符(符合你要求的固定删8位的逻辑)

先通过length($1)拿到服务名字段的总长度,再做截取:

f_status () {
        systemctl list-units | grep $1 | awk '{ printf("SERVICE STATUS:  %-25s \t %s \t %s \t %s\n", substr($1, 1, length($1)-8),$2,$3,$4) }'
}

同时可以把f_line函数里的横线长度改短,匹配最终输出的宽度:

f_line() {
        echo "-----------------------------------------------------------------------------------"
}

完整修改后脚本

#!/bin/bash

f_status () {
        systemctl list-units | grep $1 | awk '{ sub(/\.service$/, "", $1); printf("SERVICE STATUS:  %-25s \t %s \t %s \t %s\n",$1,$2,$3,$4) }'
}

f_line() {
        echo "-----------------------------------------------------------------------------------"
}

echo ""
f_line
f_status "cron"
f_status "ssh"
f_line

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:36:04