请求解释一段统计Linux本地用户数量的Awk脚本
详解这段统计Linux本地用户的Awk脚本
没问题,我来一步步拆解这段Awk脚本,帮你彻底搞懂它的运行逻辑:
awk -F: '$3 >= 1000 && !($1 == "nobody" && $3 == 65534) { SUM+=1 } END { print SUM }' /etc/passwd
1. 基础参数:awk -F:
-F: 是Awk的字段分隔符参数,告诉Awk用冒号:来拆分每行的内容。因为/etc/passwd文件的每一行都是冒号分隔的用户信息,格式大概是:
用户名:密码占位符:UID:GID:用户描述:家目录:登录Shell
拆分后,每一部分会被Awk分配到$1(用户名)、$2(密码占位符)、$3(UID)...这样的变量里。
2. 筛选条件:$3 >= 1000 && !($1 == "nobody" && $3 == 65534)
这部分是脚本的核心筛选规则,由两个逻辑条件组合而成:
$3 >= 1000:匹配UID(第三个字段)大于等于1000的行。在Linux系统中,普通用户的UID通常从1000开始,小于1000的一般是系统用户(比如root的UID是0),所以这一步是先筛选出普通用户的候选。&&:逻辑“与”,要求同时满足前后两个条件。!($1 == "nobody" && $3 == 65534):!是逻辑“非”,意思是排除掉用户名是nobody且UID是65534的行。nobody是Linux里的特殊匿名用户,有些系统会给它分配65534这个UID,我们不需要把它统计到普通用户里,所以用这个条件排除。
3. 计数动作:{ SUM+=1 }
当某一行满足上面的筛选条件时,Awk就会执行这个代码块:把变量SUM的值加1。SUM是Awk的自定义变量,默认初始值为0,每匹配到一个符合要求的用户,它就会自动累加。
4. 最终输出:END { print SUM }
END是Awk的特殊模块,只会在所有行都处理完成后执行一次。这里的作用就是把统计好的SUM值打印出来,也就是我们想要的符合规则的本地用户数量。
5. 目标文件:/etc/passwd
这是Awk要处理的目标文件,它存储了Linux系统中所有用户的账户信息,脚本就是从这里读取数据进行统计的。
举个简单例子:
- 如果
/etc/passwd里有一行alice:x:1001:1001::/home/alice:/bin/bash,它的UID是1001≥1000,且不是nobody,所以SUM会加1。 - 如果有一行
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin,虽然UID≥1000,但因为是nobody且UID为65534,会被排除,SUM不会变化。
内容的提问来源于stack exchange,提问作者Ong Bang Rui




