我有以下代码,感谢帮助我的人这里
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