我正在尝试验证除预定义的软件包列表之外的所有软件包,我知道这些软件包将因已知原因而失败。该脚本将在我们环境中的所有 Solaris 系统上运行,以确认系统基线。
我对任何适用于此的技术持开放态度,并且可以将其放在一行上(我用于验证的工具的限制)。
我最初的想法是获取一个 pkg 列表,通过 AWK 运行它以获取包名称,过滤掉我不需要的包,然后对剩余的每个包单独运行单独的 pkg 验证。
这是我在下面创建的代码:
pkg list | awk 'BEGIN {c=0} $1 == "exclude1" || $1 == "exclude2" { next } { system("pkg verify " $1); c++ } END { if (c == 0) print "none" }'
我遇到的问题是我没有看到任何输出,即使我知道应该有一些东西无法通过 pkg 验证。
我认为系统(会捕获输出,但我对 AWK 比较陌生,可能是我误解了某些内容。
答案1
在 Solaris 11.3 上,您将希望使用nawk
而不是awk
. nawk
("new awk
") 默认安装,并且应该位于您的路径 ( /usr/bin/nawk
) 中。
system()
(任何实现)中的函数不awk
返回命令的输出,而是返回其退出代码。不过这没关系,因为你可能不想要实际的输出pkg
。如果出现问题,该pkg
命令将以非零退出代码退出(请参阅手册pkg
)。
以下管道将获取pkg list
输出并跳过第一行(这是标题)以及与排除的包名称匹配的所有行。对于其余的输入行,它将使用包名称pkg verify
执行。system()
如果pkg verify
返回非零退出状态,它将增加一个计数器。处理结束时,将显示计数器,显示发生了多少次验证错误。
pkg list | nawk 'NR > 1 && !/exclude1|exclude2/ { if (system("pkg verify " $1)) { e++ } } END { printf("%d errors\n", e) }'
但这是相当低效的。一次性获取软件包列表并验证它们会更快:
pkg list | nawk 'NR > 1 && !/exclude1|exclude2/ { print $1 }' | ( xargs pkg verify ) || echo "there were errors"
如果文件中有要忽略的包列表:
pkg list | /usr/xpg4/bin/grep -F -v -f excluded.txt | nawk 'NR > 1 { print }' | ( xargs pkg verify ) || echo "there were errors"
答案2
更改您的脚本以使用 gawk 而不是 awk。
简单测试:
# pkg list|awk '{system("pkg verify $1")}'
#
# pkg list|gawk '{system("pkg verify $1")}'
PACKAGE STATUS
pkg://solaris/driver/storage/ssd ERROR