列没有去角色与awk和printf

0

的问题

我有这个脚本:

#!/bin/bash

f_status () {
        systemctl list-units | grep $1 | awk '{ 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

这个脚本给了我这样一个结果是:

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

和我搜索如何删除"。服务"3d列。

我试着用substr($i,0,-8)and${1:-8}

没有任何人有任何想法摆脱的8个字符从终端,使它看起来是这样的:

-----------------------------------------------------------------------------------
SERVICE STATUS:  cron                    loaded          active          running
SERVICE STATUS:  ssh                     loaded          active          running
-----------------------------------------------------------------------------------
awk bash printf
2021-11-23 11:39:15
3

最好的答案

0

你永远不需要查询的时候你使用awk因为 grep 'foo' file | awk '{print 7}' 可以写只是 awk '/foo/{print 7}' file.

而不是数字,只是删除一切开始从最后一个 .:

systemctl list-units |
awk -v tgt="$1" '
    {
        svc = $1
        sub(/\.[^.]*$/,"",svc)
    }
    svc == tgt {
        printf "SERVICE STATUS:  %-25s \t %s \t %s \t %s\n",svc,$2,$3,$4
    }
'

我也加强了你的比较,以避免错误的匹配,如果用的服务名称的一个子集的其他一些服务名称或包含regexp metachars喜欢 ..

2021-11-23 12:10:21

谢谢你的超级快速回答。 谢谢还建议在"查询"和"awk"-我会谨记在心。 我花了4小时,在这个任务我还不知道如何来解决这个问题。
gacek

我选择了你的解决方案并遵循你的建议后反应行为。 再次感谢你和最好的问候!
gacek
0

你需要计算端的位置的基础上串的长度,考虑以下简单的例子,让我们 file.txt 内容是

cron.service
ssh.service

然后

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

输出

cron
ssh

说明:参数 substr 是串,开始位置,端的位置, length 回数字符串。

(测试呆子4.2.1)

2021-11-23 12:04:06

谢谢你的解释。 我尝试了这种方式之前:substr(1美元、长度、-8),但我不认为我应该指定一个变量,应该计数字。
gacek

@gacek length 使用时没有 () 只是变量保持数字在整个线($0),而不是特定领域,例如,如果将文件与单一条线: 123 456 然后 {print length}7,因为它已经6个数字和空间。
Daweo

关于 length when used without () is just variable -没有,它仍然是一个功能的电话,它只是简写 length($0). 如果这是一个可变的然后,除其他事项外,您可以分配一个值,但您不能。
Ed Morton
0

你可以使用 gsub funtion在awk,如下所示:

 systemctl list-units | grep 'cron' | awk '{gsub(".service","",$1); printf("SERVICE STATUS:  %-25s \t %s \t %s \t %s\n",$1, $2 ,$3,$4) }'
SERVICE STATUS:  crond                       loaded      active      running
2021-11-23 12:04:26

1) gsub() 是用于制作多个替代,而你只想要做的1所以你应该能用 sub() 相反,2)第一个参数的任何 *sub() 功能是regexp,没有一串,所以你应该使用regexp /.../不串 "..."、分隔符3)应锚你regexp与终止 $ 所以你删除最后一个发生在行,不是第一、第4)你需要逃脱的 . 在regexp或者它将与任何角色,而不仅仅是 . 你要相匹配,5)你不需要 grep 当你使用 awk 由于 grep 'cron' | awk '{foo}' = awk '/cron/{foo}'.
Ed Morton

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................