Dou*_*oug 5 scripting solaris awk
我正在尝试验证所有包,除了我知道由于已知原因会失败的预定义包列表。该脚本将在我们环境中的所有 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" }'
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是我没有看到任何输出,即使我知道应该有一些事情没有通过 pkg 验证。
我认为系统(会捕获输出,但我对 AWK 比较陌生,可能是我误解了一些东西。
在 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) }'
Run Code Online (Sandbox Code Playgroud)
但这是相当低效的。一次性获取软件包列表并验证它们会更快:
pkg list | nawk 'NR > 1 && !/exclude1|exclude2/ { print $1 }' | ( xargs pkg verify ) || echo "there were errors"
Run Code Online (Sandbox Code Playgroud)
如果文件中有要忽略的包列表:
pkg list | /usr/xpg4/bin/grep -F -v -f excluded.txt | nawk 'NR > 1 { print }' | ( xargs pkg verify ) || echo "there were errors"
Run Code Online (Sandbox Code Playgroud)