awk 和 printf 没有最后一个字符的列

Column without last characters with awk and printf

我有这个脚本:

#!/bin/bash

f_status () {
        systemctl list-units | grep  | awk '{ printf("SERVICE STATUS:  %-25s \t %s \t %s \t %s\n",,,,) }'
}

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

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

这个脚本给了我这样的结果:

-------------------------------------------------------------------------------------------
SERVICE STATUS:  cron.service                    loaded          active          running
SERVICE STATUS:  ssh.service                     loaded          active          running
-------------------------------------------------------------------------------------------

然后我搜索如何从 3d 列中删除“.service”。

我尝试使用 substr($i, 0, -8) 和 ${1:-8}

有没有人知道如何去掉末尾的 8 个字符,使其看起来像这样:

-----------------------------------------------------------------------------------
SERVICE STATUS:  cron                    loaded          active          running
SERVICE STATUS:  ssh                     loaded          active          running
-----------------------------------------------------------------------------------

使用 awk 时永远不需要 grep,因为 grep 'foo' file | awk '{print 7}' 可以写成 awk '/foo/{print 7}' file.

不计算字符数,只删除从最后一个 .:

开始的所有内容
systemctl list-units |
awk -v tgt="" '
    {
        svc = 
        sub(/\.[^.]*$/,"",svc)
    }
    svc == tgt {
        printf "SERVICE STATUS:  %-25s \t %s \t %s \t %s\n",svc,,,
    }
'

我还加强了您的比较,以避免在使用作为其他服务名称的子集或包含 ..

等正则表达式元字符的服务名称调用时出现错误匹配

您需要根据字符串长度计算结束位置,请考虑以下简单示例,令 file.txt 内容为

cron.service
ssh.service

然后

awk '{print substr(,1,length()-8)}' file.txt

输出

cron
ssh

解释:substr 的参数是字符串,开始位置,结束位置,length return 字符串中的字符数。

(在 gawk 4.2.1 中测试)

你可以在 awk 中使用 gsub 函数,如下所示:

 systemctl list-units | grep 'cron' | awk '{gsub(".service","",); printf("SERVICE STATUS:  %-25s \t %s \t %s \t %s\n",,  ,,) }'
SERVICE STATUS:  crond                       loaded      active      running