如何检查 awk 中是否存在文件? [-d '文件名'] 失败

如何检查 awk 中是否存在文件? [-d '文件名'] 失败

我正在尝试生成一个主目录集不存在的用户列表。看来我应该能够用 awk 来做到这一点,但我的语法有问题。

它一直告诉我在 ] 处“语法无效”。我究竟做错了什么?

awk -F: '{ if(![ -d "$6"]){ print $1 " " $3 " " $7}}' /etc/passwd

我可能最终使用的最终代码是:

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

我有这里有一个相关问题

答案1

你可以使用

系统(命令)
    执行操作系统命令命令进而
    返回 awk 程序。返回命令的退出状态。 

例如:

awk -F: '{if(system("[ ! -d " $6 " ]") == 0) {print $1 " " $3 " " $7}}' /etc/passwd

答案2

我不认为那[ -d ]是一个awk东西,那是一个空壳的东西。我会这样做:

awk -F: '{ print $1,$3,$7}' /etc/passwd | 
    while read name uid shell; do 
        [ -d "/home/$name" ] || echo "$name $uid $shell"; 
    done

当然,正如@Janis 非常正确地指出的那样,您可以在 shell 中完成整个操作:

while IFS=: read  name x uid x x x shell rest; do
     [ -d "/home/$name" ] || echo "$name $uid $shell" 
done < /etc/passwd

答案3

您可以使用获取线:

BEGIN {
   print getline < "file" < 0 ? "not exists" : "exists"
}

答案4

几乎是 awk...

perl -F: -ane 'if(!-d $F[5]){ print "$F[0] $F[2] $F[6]" }' /etc/passwd

相关内容