Intereting Posts
Всегда ли shebang совпадает с каталогом установки интерпретатора? Могу ли я отлаживать проблемы загрузки / сети при использовании стандартного ISO с debian-installer? Можем ли мы объединить двоичные файлы без какой-либо операции копирования, обратившись к файловой системе? Почему я не могу подключиться к mysql через браузер, а через терминал с php? GRUB Boot Loader set timeout = 0, как получить меню загрузки? Черный графический сбой на CentOS7 GNOME Что произойдет, если я переведу жесткие диски, используемые Rsync на другой компьютер, и синхронизирую их с ним? эквивалент команды stat GNU для ksh на AIX Каков стандарт для отступов в сценариях оболочки? LFS 7.10 – почему я получаю сообщение об ошибке при использовании команды make для expect-5.45 iterm-синхронизация сеансов по новым вкладкам Звуковые проблемы с pulseaudio Каков предпочтительный способ создания программного обеспечения в BSD? Псевдотерминал передает stream байтов или сообщение? Изменение размеров каталогов

Как найти наиболее распространенное имя в файле passwd

В моем /etc/passwd есть список пользователей в формате, который выглядит так:

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

Цель. Я хочу видеть только первые имена, а затем сортировать их с самым распространенным именем, первым, вторым наиболее часто встречающимся 2-м и т. Д ….

Я видел некоторые решения относительно того, как сделать вторую часть, хотя они имеют отношение к работе с текстовым файлом, а не к чтению с карты.

Что касается первой части, я действительно не знаю, как подойти к этому. Я знаю, что есть некоторые решения, но не знаю, как их сделать.

Один из способов сделать это:

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

Сначала используйте awk и сортировку, чтобы иметь наиболее распространенное имя:

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

Для нечувствительной к регистру версии:

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

Для тех, кто предпочитает их команды, распределенные по нескольким строкам:

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

Как это работает

  • -F:

    Это делает : разделитель полей.

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

    Это удаляет все после первого периода из поля 5.

  • a[$5]++

    Счет количества раз, когда это имя появилось, хранится в ассоциативном массиве a . Это увеличивает счетчик. Для версии без учета регистра это заменяется a[tolower($5)]++ .

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

    Это печатает счетчик и имя для всех результатов, которые мы имеем в массиве a .

  • sort -nr

    Это сортирует результат численно в порядке убывания.