丢弃任何不是实际字母的字符。使用 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 中测试)
所以我有一个脚本来查找我的服务 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 中测试)