/etc/passwdから読み取ったユーザー名が特定の指示に従わない場合は、エラーメッセージを印刷するawkコマンドを探しています。手順は次のとおりです。フィールドは文字で始まる必要があり、最大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
最も簡単な方法は、ユーザー名の条件ごとに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
(等)