我正在寻找一个 awk 命令,如果从 /etc/passwd 读取的用户名不遵循某些准则,则该命令会打印错误消息。准则是: 该字段必须以字母开头,最多可包含 8 个字母、数字、下划线、连字符和点。我已设法确保用户名不超过 8 个字符,但我在执行命令时遇到困难,这意味着它只能是字母、数字、下划线、连字符和点。
当前代码:
{if (length($1) >= 9) print "Error: The username has too many characters on line " NR}
{if ($1 != [a-z]) print "Error"} //Here is where I need the command.
我需要多个 if 语句吗?如果是的话你能帮我找到合适的 awk 语句吗
谢谢
答案1
我认为最简单的方法是对用户名的每个条件进行一次测试。这样就可以很容易地看到正在发生的事情,并且很容易修改和扩展。单个正则表达式很快就会变得太笨重。
/^[^a-z]/ { printf("Does not start with a letter:\t%s\n", $0) }
length > 8 { printf("Longer than 8 characters:\t%s\n", $0) }
/[^a-z0-9_.-]/ { printf("Contains disallowed characters:\t%s\n", $0) }
这里唯一需要注意的是-
上次测试中的破折号 ( )。它必须位于 中的第一个或最后一个[...]
。
使用来自以下位置的用户名提供 awk 脚本/etc/passwd
:
$ cut -d ':' -f 1 /etc/passwd | awk -f usernamecheck.awk
Does not start with a letter: _portmap
Does not start with a letter: _identd
Does not start with a letter: _rstatd
Does not start with a letter: _rusersd
Does not start with a letter: _fingerd
Does not start with a letter: _x11
Does not start with a letter: _switchd
Does not start with a letter: _traceroute
Longer than 8 characters: _traceroute
(ETC。)