如何使用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
相关产品推荐
相关产品推荐

