既知の理由で失敗すると予想される定義済みパッケージのリストを除くすべてのパッケージを検証しようとしています。このスクリプトは、システム基準を確認するために、環境内のすべてのSolarisシステムで実行されます。
私はこれのために働くすべての技術にオープンであり、1行に置くことができます(検証に使用するツールの制限)。
私の最初のアイデアは、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の検証に失敗することがあることを知っているにもかかわらず、出力が表示されないことです。
私はsystem(この出力をキャプチャすると思いましたが、私はAWKを比較的初めて知り、何かを間違って理解しているかもしれません)。
ベストアンサー1
nawk
Solaris 11.3では、デフォルトインストールの代わりにawk
。 nawk
( "new ")を使用しようとしており、awk
これはパス(/usr/bin/nawk
)になければなりません。
system()
awk
(すべての実装)の関数は、コマンドの出力を返さずに終了コードを返します。でも大丈夫です。おそらく実際の出力を望まないからですpkg
。問題が発生すると、pkg
コマンドはゼロ以外の終了コードで終了します(マニュアルを参照pkg
)。
次のパイプラインはpkg list
出力を取得し、最初の行(ヘッダー)と除外されたパッケージ名と一致するすべての行をスキップします。残りの入力行はpkg verify
パッケージ名を使用して実行されます。system()
pkg verify
0以外の終了ステータスが返されると、カウンタがインクリメントされます。処理が終了すると、発生した検証エラーの数を示すカウンタが表示されます。
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"