AWKコマンドの出力がない場合は「No Results」と表示されます。

AWKコマンドの出力がない場合は「No Results」と表示されます。

私を助けてくれた皆さんに感謝します。次のコードがあります。ここ

awk -F: '{if(system( "[ -d " $6 " ]") == 1) {print "The directory " $6 " does not exist for user " $1 }}' /etc/passwd

しかし、私は愚かで、私の問題全体を説明しませんでした。人々に質問を変えるのではなく、新しい質問をしてみようと思いました。

私の目標は、/etc/passwdに設定されたホームディレクトリが存在しないフォルダを指すユーザーのリストを出力することです。 (上記のコードはこれを正常に実行します)。

今私が経験している問題は、各ユーザーが実際に存在するホームディレクトリを持っている場合は、空のページの代わりに「結果なし」を表示したいということです。

たとえば、デフォルトのRHELシステムでこのコードを実行すると、次の出力が表示されます。

# awk -F: '{if(system( "[ -d " $6 " ]") == 1) {print "The directory " $6 " does not exist for user " $1 }}' /etc/passwd
The directory /var/adm does not exist for user adm
The directory /var/spool/uucp does not exist for user uucp
The directory /var/gopher does not exist for user gopher
The directory /var/ftp does not exist for user ftp
The directory /var/empty/saslauth does not exist for user saslauth

上記のユーザーはログインできないため、実際には重要ではありません。したがって、これを説明するために、次のようにコードを更新したいと思いました。

awk -F: '{if(system( "[ -d " $6 " ]") == 1 && $7 != "/sbin/nologin" ) {print "The directory " $6 " does not exist for user " $1 }}' /etc/passwd

これは期待どおりに機能し、結果を表示しませんが、何も表示しない代わりに「結果なし」を表示したいと思います。 (これは愚かな要求のように見えるかもしれませんが、ボール出力がある場合はよりうまく機能する自動化されたツールでこのコマンドを使用します。)

Googleで検索してNRを使用する例をいくつか見つけましたが、うまく機能しませんでした。また、||を見てみると、特定のタイプのコマンドに対して「結果なし」が表示されますが、それも機能しないようです。

Googleは他のオプションを選択するのに役立たないので、助けてくれてありがとう。

答え1

あなたはできます

  • ブロックを使用したフラグのBEGIN設定
  • 現在のテストで見つからないディレクトリが見つかると、フラグは設定解除されます。
  • フラグがENDブロックにまだ設定されていることを確認し、その場合はメッセージを印刷してください。

例えば

awk -F: '
BEGIN{nores=1;} 
{if(system( "[ -d " $6 " ]") == 1 && $7 != "/sbin/nologin" ) {print "The directory " $6 " does not exist for user " $1; nores=0 }} 
END{if (nores) print "No results";}
' /etc/passwd

関連情報