Como encontrar o nome mais comum no arquivo passwd

0

Meu /etc/passwd tem uma lista de usuários em um formato semelhante a este:

username:password:uid:gid:firstname.lastname, somenumber:/...

Objetivo: quero ver apenas os primeiros nomes e, em seguida, classificá-los com o nome mais comum em primeiro lugar, o segundo mais comum aparece em 2º, etc ....

Eu vi algumas soluções como como fazer a segunda parte, embora sejam relevantes para trabalhar com um arquivo de texto e não para ler de um mapa.

Em relação à primeira parte, eu realmente não sei como abordar isso. Eu sei que existem algumas soluções, mas não sei como fazê-las.

    
por PanthersFan92 09.08.2016 / 09:47

2 respostas

5

Uma maneira de fazer isso:

cut -d: -f5 /etc/passwd | \
    sed 's/\..*//' | \
    sort -i | \
    uniq -ci | \
    sort -rn
    
por 09.08.2016 / 09:51
2

Usando o awk e a classificação para ter o nome mais comum primeiro:

awk -F: '{sub(/[.].*/, "", $5); a[$5]++} END{for (n in a)print a[n],n}' /etc/passwd | sort -nr

Para uma versão sem distinção entre maiúsculas e minúsculas:

awk -F: '{sub(/[. ,].*/, "", $5); a[tolower($5)]++} END{for (n in a)print a[n],n}' /etc/passwd | sort -nr

Para aqueles que preferem seus comandos espalhados por várias linhas:

awk -F: '
  {
    sub(/[.].*/, "", $5)
    a[$5]++
  }

  END{
    for (n in a)
      print a[n],n
  }
  ' /etc/passwd | sort -nr

Como funciona

  • -F:

    Isso torna : o separador de campos.

  • sub(/[.].*/, "", $5)

    Isso remove tudo após o primeiro período do campo 5.

  • a[$5]++

    A contagem do número de vezes que este nome apareceu é armazenada no array associativo a . Isso incrementa o contador. Para a versão sem distinção entre maiúsculas e minúsculas, isso é substituído por a[tolower($5)]++ .

  • END{for (n in a)print a[n],n}

    Isso imprime a contagem e o nome de todos os resultados que temos no array a .

  • sort -nr

    Isso classifica a saída numericamente em ordem decrescente.

por 09.08.2016 / 10:10