丢弃任何不是实际字母的字符。使用 awk - Bash

Discard any characters that are not actual letters. using awk - Bash

所以我有一个脚本来查找我的服务 vmxd.service 是否存在,并检查其当前状态 loaded,运行,活跃...

我在这种情况下使用以下脚本。

systemctl --all --type service | awk -v pat="$SERVICE" '[=11=] ~ pat {print [=11=]}'

● vmxd.service                                          loaded    failed   failed  Juniper vMX Router

请记住 $SERVICE="vmxd.service"

问题是在某些服务器中,[●] 不存在,所以我通过打印第一个单词 {print $1} 来推断它会成为获取名称的把戏。

当我在另一台主机上检查我的脚本时,现在不是打印 vmxd.service 因为它是字符串的第一个字符,而是打印 [●] 并且完全破坏了我的脚本。

Here is an Output of my Script showing the [●]
[...] 
The service file: vmxd.service has been found under /etc/systemd/system/
Check if WorkingDirectory path is correct............................[OK]
Check if service exist...............................................[Found]
Check if ● is loaded...............................................[No]
Check if ● is active...............................................[No]
Enabling service....................................................../init.sh: line 189: command not found
Reloading Service....................................................[No]
Check if 'vmxd.service' has started successfully.....................[Started]

这个问题有解决方法吗?如果检测到 [●],有没有办法在不改变 {print $1} 的情况下忽略。通过打印 $1 它应该说 vmxd.service 不管

通常情况下,我的脚本运行的服务器上的输出如下:

  vmxd.service                                          loaded    active   exited  Juniper vMX Router

没有 [●]。

注意:我不太清楚那个点的实际含义,但无论如何我只需要从我的变量 运行 命令中忽略那个字符

您可以从 awk 输出中删除所有非 ASCII 字符:

systemctl --all --type service |
awk -v pat="$SERVICE" '[=10=] ~ pat {sub(/[^\x01-\x7f]+/, ""); print}'

从您的脚本更改为此调用:

sub(/[^\x01-\x7f]+/, "")

正则表达式模式 [^\x01-\x7f]+ 匹配 1+ 个不在 x01-x7F (1-127) 的 ASCII 范围内的任何字符,并通过将其替换为空字符串来删除它们。

Is there a workaround for this issue? Is there a way to, if [●] is detected ignore without altering the {print }. By printing it should say vmxd.service regardless

您可能会通知 GNU AWK 使用 FPAT 变量仅处理字母数字和点,请考虑以下简单示例,令 file.txt 内容为

● vmxd.service                                          loaded    failed   failed  Juniper vMX Router
vmxd.service                                          loaded    active   exited  Juniper vMX Router

然后

awk 'BEGIN{FPAT="[0-9A-Za-z.]+"}{print }' file.txt

输出

vmxd.service
vmxd.service

(在 GNU Awk 5.0.1 中测试)