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
我有这个脚本:
#!/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