Imprimindo os nomes de usuário mais longos

2

Eu gostaria de saber se é uma maneira de imprimir o nome mais longo dos nomes de usuários no linux. Pode ser feito?

    
por Redi Ramaj 17.06.2018 / 11:33

4 respostas

4

Para obter o nome de usuário mais longo (e seu tamanho):

$ getent passwd | awk -F':' '{ print length($1), $1 }' | sort -rn | head -n 1
11 _traceroute

Ou seja, obtenha o arquivo passwd , calcule o tamanho de cada nome de usuário (a 1a : -delimited string), classifique por tamanho e escolha o primeiro.

Se houver vários nomes de usuário do mesmo tamanho, o que ordena por último lexicograficamente é escolhido.

Para obter o nome real mais longo (e ver qual nome de usuário é o nome real e o comprimento):

$ getent passwd | awk -F':' '{ print length($5), $1, $5 }' | sort -rn | head -n 1
32 _rtadvd IPv6 Router Advertisement Daemon

Isso faz a mesma coisa que o primeiro comando, mas calcula o comprimento da quinta string: -delimited no arquivo passwd . Este campo contém o nome real do usuário. A saída é o tamanho do nome real, o nome de usuário e o nome real.

Em alguns sistemas, um & no nome real do usuário será substituído pelo nome de usuário quando o campo for acessado por certas ferramentas como finger ou sendmail . Por exemplo, uma entrada passwd pode ser

operator:*:2:5:System &:/operator:/sbin/nologin

Para levar isso em conta ao calcular o tamanho do nome real:

getent passwd | awk -F':' '{ gsub("&", $1, $5); print length($5), $1, $5 }' | sort -rn | head -n 1

Além disso, deixe awk selecionar o nome mais longo, livrando-se do sort e head :

getent passwd |
awk -F':' '
          { gsub("&", $1, $5) ; len = length($5)      }
len > max { line = $0         ; max = len;            }
END       { split(line, a, FS); print max, a[1], a[5] }'

Com este código, o nome mais longo encontrado será escolhido se houver vários nomes com o mesmo tamanho.

    
por 17.06.2018 / 11:54
1

Isso é muito pouco otimizado, mas como geralmente você não tem dezenas de milhares de usuários em um banco de dados lento, isso pode acontecer:

getent passwd | cut -d: -f1 \
| grep $(getent passwd | cut -d: -f1 | tr '[:print:]' '.' | sort | tail -n1)

Vamos desfazer um pouco essa coisa: getent passwd listará o banco de dados do usuário. As linhas lá estão na forma

root:x:0:0:root:/root:/bin/bash

Nome de usuário, x , UID, GID, GECOS (geralmente nome de usuário legível agora), diretório inicial, shell. Usamos cut -d:1 -f1 para cortar tudo, exceto o primeiro campo : -delimited, ou seja, o nome de usuário.

No total, estamos fazendo isso duas vezes: uma para encontrar o comprimento do nome de usuário mais longo (linha 2) e, em seguida, para encontrar nomes de usuário dessa extensão.

Para encontrar o comprimento do nome de usuário mais longo, usamos apenas tr para trocar todos os caracteres por . s. Então, podemos simplesmente classificar a lista e saber que a string mais longa de . s é a última, então obtemos isso com tail -n1 . (Tecnicamente, isso exige que sempre haja pelo menos um usuário, mas há raiz, então essa é uma suposição bastante segura.)

Agora, temos uma sequência de pontos que é tão longa quanto o nome de usuário mais longo. Temos sorte, pois . é o caractere curinga de "qualquer caractere" para expressões regulares, por isso usamos grep para corresponder a todos os nomes de usuários com relação a essa sequência de espaços, e apenas a correspondência mais longa corresponderá.

(FWIW, na minha caixa do CentOS, foi systemd-network .)

Se você quiser os nomes legíveis por humanos, você basicamente quer apenas cut -d: -f5 .

    
por 17.06.2018 / 11:42
1

Eu tenho um arquivo que contém nome, sobrenome e endereço de e-mail dos usuários. Aqui está o que eu fiz para imprimir o primeiro nome mais longo:

awk '{print length($1), $1}' filename | sort -nr | head -1| cut -d\  -f2

Sinta-se à vontade para ajustá-lo de acordo com sua preferência. Note que você atingiu dois espaços após -d\

Para imprimir o nome de usuário mais longo, você pode usar

grep -v "^#" /etc/passwd | awk -F: '{print length($1), $1}' | sort -nr | head -1 | cut -d\  -f2

Para imprimir o nome de usuário real, use

grep -v "^#" /etc/passwd | awk -F: '{print length($5), $5}' | sort -nr | head -1 | cut -d\  -f2-

Você coloca um traço depois de -f2 no final para ter certeza de obter espaços no nome real do usuário.

    
por 17.06.2018 / 11:44
0

Abaixo estão os 10 nomes de usuários mais longos, excluindo os usuários do sistema

sed -n '/sbin/!p' /etc/passwd|  awk -F ":" '{print length($1),$1}'| sort -k1 -nr| head

saída

   9 praveen10
9 lost_foud
8 p2_final
7 praveen
6 p1_new
5 user5
5 user4
5 user3
5 user2
5 user1
    
por 17.06.2018 / 16:10