Comando Awk para definir as diretrizes de nome de usuário

0

Estou procurando um comando awk que imprima uma mensagem de erro se o nome de usuário que está lendo em / etc / passwd não seguir certas diretrizes. As diretrizes são: Este campo deve começar com uma letra e pode conter até 8 letras, dígitos, sublinhados, hip-phens e pontos.  Eu consegui ter certeza de que o nome de usuário tem 8 caracteres ou menos, mas estou tendo dificuldade com um comando, o que significa que ele deve ser apenas letras, dígitos, sublinhados, hy-phens e pontos.

Código atual:

{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.

Eu preciso de várias declarações if? Se assim for, você pode me ajudar a encontrar uma instrução awk apropriada

Obrigado

    
por Seb 11.10.2016 / 01:00

1 resposta

2

Acho que a maneira mais fácil de fazer isso seria fazer um teste para cada condição no nome de usuário. Desta forma, é fácil ver o que está acontecendo e é fácil de modificar e ampliar. Uma única expressão regular logo seria muito difícil de lidar.

/^[^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) }

A única coisa a observar aqui é o traço ( - ) no último teste. Deve ser localizado primeiro ou último no [...] .

Alimente o script awk com os nomes de usuário de /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.)

    
por 16.02.2017 / 00:42

Tags