当 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

相关内容