Вывести отсортированный в алфавитном порядке список имен пользователей в файле passwd

Обновлено: 07.07.2024

Команда sort сортирует содержимое файла в алфавитном или нумерологическом порядке. Если задать несколько файлов, то команда sort соединит их и, рассортировав, выдаст единым выводом. По умолчанию, объектом сортировки будут строки, однако опции позволяют выбирать объект сортировки: колонки, столбцы и прочие элементы форматирования файла. Разделителем между ними служат пробелы, однако соответствующие опции позволяют задать иные разделители.

Команда sort весьма древняя, она может служить образцом программирования утилит в ранних 70-х годах прошлого века. У команды множество опций, и их разнообразные сочетания, а также способы задания разделителей, хорошо развивают память и воображение.

Программа sort без опций

Я составил список своих должников и записал их в файл debts.txt:

Если мне придет в голову рассортировать должников по алфавиту, то я дам команду:

А могу и в обратном алфавиту порядке:

Параметры sort

Опции -n и -k

Приходится рассматривать эти две опции вместе, так как они позволяют сразу ввести читателя в курс дела, а не рассматривать множество простых примеров.

Опция -n используется всегда, когда нужно сортировать числа, разумеется в порядке возрастания (или убывания, добавив опцию -r).

Опция -k позволяет задавать объект сортировки: все эти столбцы, колонки, и тому подобные элементы форматирования файла.

Итак, я хочу выявить самых злостных должников по мере убывания долга:

Опция -n сообщает команде, что сортировать придется числа, опция -r , что в обратном порядке, а опция -k задает объект - вторую колонку текста.

У нас есть еще одна колонка с числами месяцев, можно для тренировки рассортировать список по числам разных месяцев, хотя никакого практического смысла это не имеет:

Видите, в пятой колонке числа идут по возрастающей. Древность программы сказывается еще и в том, что можно вводить опции по-разному. Например можно набрать:

с тем же результатом. И даже:

Должен предупредить, что существует два стиля задания объекта сортировки. (Имейте в виду, по-английски эти объекты называются fields, что обычно переводится как поля. Если видите в манах слова: fields или поля, знайте - речь идет о колонках, столбцах, или иных элементах форматирования текста). Но вернемся к стилям задания этих самых "полей".

Новый стиль использует опцию -k и цифры, указывающие порядковый номер нужной колонки с начала строки (начиная с 1).Возьмем файл pay.txt:

И дадим команду:

Сортировка произошла по первому символу второй колонки, что не дало нам никакой пользы. Изменим команду:

Указав пятый символ (считая точки) во второй колонке (-k2.5), мы получили алфавитный список сотрудников.

Теперь рассмотрим файл ivanov.txt:

Рассортируем его строго по второй колонке, не принимая во внимание колонку с инициалами:

Для этого мы применили опцию -k 2,2. Первая двойка означает начало объекта сортировки (колонки текста), а вторая двойка через запятую - конец объекта сортировки. То есть команде запрещено использовать для сортировки символы после последней буквы второй колонки.

Мы видим, что Ивановы идут в том же порядке, что и в исходном файле. А если мы хотим рассортировать Ивановых в алфавитном порядке их инициалов?

Мы приказали использовать для сортировки вторую и третью колонки текста (-k 2,3). Теперь Ивановы отсортированы и по инициалам. Но важнее знать, кто из Ивановых больше должен:

Теперь инициалы не сортируются, так как первичная сортировка проводится строго по второй колонке (-k 2,2), а вторичная сортировка (-k 4n) по 4 колонке, в нумерологическом порядке, и только среди Ивановых (то есть тех, кто не различался по результатам первичной сортировки). Теперь становится понятно, зачем нужна такая сортировка - строго по заданному объекту.

Надеюсь, что новый стиль написания опции -k стал понятен. Новый стиль применяется на всех современных версиях команды sort, включая GNU Coreutils, которыми укомплектованы все новые дистрибутивы Линукс.

Вкратце коснусь старого стиля написания опции -k. Вот пример задания третьего столбца для нумерологической сортировки:

  • Новый стиль: sort -k 3,3n имя_файла
  • Старый стиль: sort +2 -3n имя_файла

Старый стиль работает на новых версиях программы, но рассматривать его в подробностях я не стану, чтобы не запутаться самому и не запутать читателя. Нам хватит путаницы и с новым стилем.

Опция -r

Мы уже познакомились с ней. Она заставляет команду sort сортировать в обратном порядке. (От 'z' к 'a' и от 1000000 к 0).

Опция -M

Я не могу не остановится на одной удивительной способности команды sort - она может сортировать даже месяцы. Вернемся к файлу debts.txt:

Названия месяцев у нас в 4 колонке, поэтому пишем:

Вуаля! Мне это почему-то кажется чудом. Можно задать ту же команду и по-другому:

Опция М преобразует первые три непробельные символа указанного столбца в заглавные буквы (Скажем, SEP означает SEPtember), а затем сравнивает их и располагает в порядке годового круга.

До сих пор мы рассматривали файлы, в которых разделителем колонок или столбцов был пробел, что и установлено по умолчанию. Чтобы задать другой разделитель, необходимо использовать опцию -t.

Опция -t

Позволяет указать иной разделитель объектов сортировки вместо пробела. Вернемся к файлу pay.txt:

В первый раз, чтобы рассортировать должников по фамилиям, мы указывали пятую букву в третьем столбце (считая разделителем столбцов пробелы). Есть другой способ решить эту задачу:

Теперь мы задали разделителем точку и указали четвертую колонку.

Давайте рассортируем по алфавиту шеллы, доступные в системе, указав разделителем слэш (-t '/'):

В директории /etc масса файлов, в которых встречаются различные разделители. Часто это двоеточие:

Эта команда рассортирует файл /etc/passwd в порядке возрастания идентификационных номеров пользователей. Проделайте этот пример самостоятельно, у него длинный вывод, боюсь мой редактор будет не в восторге.

Надеюсь, с разделителями все ясно, правила их задания очень напоминают команду cut.

Опция -c

Эта опция проверяет порядок сортировки, сама ничего не сортируя. Создадим файл 123.txt:

Вывод "неправильный порядок: 1" сообщает нам номер строки с первой ошибкой.

Опция -u

Скрывает одинаковые объекты. Если в процессе сортировки выявилось несколько одинаковых объектов, то будет выведен только первый из них, остальные проигнорированы:

Остался только один Иванов из трех.

Если бы мы задали команду чуть по-другому:

то все Ивановы остались бы на своих местах. Ответьте: почему? (Ответ в приложении [1]).

Опция -b

Игнорирует пробелы в начале строк, и сортирует так, словно пробелов нет. Возьмем файл run.txt

Применим команду sort без опций:

Фактически произошла сортировка по количеству пробелов, так как пробел предшествует буквам в порядке сортировки. Введем команду:

Теперь строки отсортированы в алфавитном порядке, невзирая на пробелы.

Немного усложним файл run.txt

И попробуем выстроить животных по алфавиту:

Ничего не выходит - сортируется количество пробелов. Но стоит добавить опцию -b

как все становится на свои места.

Опция -d

Признает только буквы, цифры и пробелы и сортирует как в словаре.

Опция -i

Весьма похожа на предыдущую опцию -d, но не такая "строгая". Она признает только печатные символы, игнорируя все специальные.

Опция -f

При обычной сортировке, заглавные буквы идут прежде строчных:

А с опцией -f все равны:

Опция -g

Позволяет сортировать числа, записанные в общей математической форме. Возьмем файл notation.txt:

и попробуем рассортировать его обычной опцией -n:

и потерпим неудачу. Тогда применим опцию -g:

Опция -T

Позволяет указать директорию для временных файлов, иную, чем положено по умолчанию (/tmp или $TMPDIR).

При сортировке больших файлов программа создает временные файлы, и можно указать, где их разместить. Примера по очевидным причинам дать не могу, просто помните про эту опцию, если случится сортировать многомегабайтные файлы.

Опция -S

Также пригодится для сортировки больших файлов. Она создаст в основной памяти буфер указанного размера.

Кстати, коли речь зашла о работе с большими файлами, то полезно бывает переместить эти процессы на задний план, чтобы можно было работать, не дожидаясь завершения процесса:

Опция -s

Эта опция отменяет пересортировку. Что это такое? - Допустим, мы сортировали некий файл по определенным, нужным нам объектам сортировки (полям, столбцам, колонкам, символам внутри колонок и так далее), применяли вторичную сортировку (как в примере sort -k 2,2 -k 4n ivanov.txt), но все объекты, выбранные нами, оказались одинаковыми (равными). В этом случае, по умолчанию, команда sort проводит пересортировку, считая объектом сортировки всю строку в целом (как в случае сортировки без опций). Если мы хотим сохранить первоначальный порядок строк файла, и не проводить финальную пересортировку, то мы применяем опцию -s.

Опция -z

Эта опция рассматривает исходный файл как набор строк, разделенных не знаком переноса строки, а нулевым байтом. Для чего это может понадобиться, я не знаю. Единственное, что мне удалось найти, это туманные указания, что эта опция может оказаться полезной в составе программных каналов (pipes) с такими командами как 'perl -0', 'find -print0', и 'xargs -0' для сортировки произвольных файловых имен. Я пока не разбирался с перечисленными программами и не могу ничего сказать по этому поводу. Я также пробовал подставлять опцию -z в многочисленные примеры из этой статьи, но никакой сортировки после добавления этой опции не происходило.

Опция -o

Видимо пережиток прошлого, когда не было перенаправления вывода. С помощью этой опции можно задать файл, куда будет помещен вывод команды вместо стандартного вывода на экран дисплея.

Послесловие

Оставшиеся опции варьируют в различных мануалах и руководствах, они достаточно понятны интуитивно, и не требуют специального рассмотрения. Если какой-то из опций нет в вашем мане, не беда, скорее всего опция поддерживается вашей версией программы. Попробуйте, чем вы рискуете? Но попадаются опции, не поддерживаемые GNU Coreutils sort, как например опции -R и --random-source=file, позволяющие "рассортировать" строки и прочие объекты в случайном порядке.

Другое дело сочетания различных опций друг с другом. Если вы соорудили заковыристое заклинание из множества разных опций, а оно не работает, попробуйте убрать ту или другую опцию, может быть поможет. А лучше идти от простого к сложному, постепенно усложняя команду, пока не достигнете нужного результата. Хорошо помогает набрать вашу команду в поисковой строке Гугла, вдруг повезет. Кстати, только этим способом я смог разобраться с некоторыми опциями, о которых пишу в этой статье.

Команда sort и кириллица

Команда sort работает с нашими буквами неадекватно.

Резюме команды sort

Чрезвычайно полезная и "мощная" команда. С ее помощью не проблема выявить в огромной директории файлы, которые вы вчера потеряли (по дате модификации), или собрать "в кучу" все линки, чтобы их проверить, и так далее. А в качестве фильтра в программных каналах (pipes), эта команда просто незаменима и позволяет творить чудеса.

Приложение

[1] Ответ на задачу про Ивановых.

В первом случае мы задали сортировку строго по второй колонке (-uk 2,2), поэтому программа видела всех Ивановых одинаковыми, и включила опцию -u.

Во втором случае мы задали сортировку, не указав конец объекта сортировки (-uk2), и программа сортировала Ивановых по следующим колонкам (могла бы до конца строки). В этом случае одинаковых объектов выявлено не было, и опция -u не включилась.

Получить список всех пользователей, использующих /etc/passwd файл

Информация о локальном пользователе хранится в /etc/passwd файле. Каждая строка в этом файле представляет регистрационную информацию для одного пользователя. Чтобы открыть файл, вы можете использовать cat или less :



Как видно из приведенного выше вывода, каждая строка имеет семь полей, разделенных двоеточиями, которые содержат следующую информацию:

  • Имя пользователя
  • Зашифрованный пароль ( x означает, что пароль хранится в /etc/shadow файле)
  • Идентификационный номер пользователя (UID)
  • Идентификационный номер группы пользователя (GID)
  • Полное имя пользователя (GECOS)
  • Домашний каталог пользователя
  • Оболочка входа (по умолчанию /bin/bash )


Если вы хотите, чтобы отобразить только имя пользователя вы можете использовать либо awk или cut команды для печати только первое поле, содержащее имя пользователя:


Получить список всех пользователей с помощью команды getent

Команда getent отображает записи из баз данных, настроенных в /etc/nsswitch.conf файле, включая passwd базу данных, которую мы можем использовать для запроса списка всех пользователей.

Чтобы получить список всех пользователей Linux, введите следующую команду:



Как видите, вывод такой же, как и при отображении содержимого /etc/passwd файла. Если вы используете LDAP для аутентификации пользователей, то getent все пользователи Linux будут отображаться как из /etc/passwd файлов, так и из базы данных LDAP.

Вы также можете использовать awk или cut для печати только первое поле, содержащее имя пользователя:


Проверьте, существует ли пользователь в системе Linux

Теперь, когда мы знаем, как составить список всех пользователей, чтобы проверить, существует ли пользователь в нашем окне Linux, мы можем просто отфильтровать список пользователей, отправив список по команде grep.

Например, чтобы узнать, существует ли пользователь с именем jack в нашей системе Linux, мы можем использовать следующую команду:



Если пользователь существует, команда, приведенная выше, напечатает информацию для входа в систему. Если нет вывода, это означает, что пользователь не существует.

Мы также можем проверить, существует ли пользователь, не используя grep команду, как показано ниже:


Как и раньше, если пользователь существует, команда отобразит информацию для входа в систему.

Если вы хотите узнать, сколько учетных записей пользователей в вашей системе, перенаправьте getent passwd вывод в wc команду:


Как видно из приведенного выше вывода, моя система Linux имеет 33 учетных записи.


Системные и обычные пользователи

Нет реальной технической разницы между системой и обычными (обычными) пользователями. Обычно системные пользователи создаются при установке ОС и новых пакетов. В некоторых случаях вы можете создать системного пользователя, который будет использоваться каким-либо приложением.

Обычные пользователи - это пользователи, созданные пользователем root или другим пользователем с привилегиями sudo. Обычно у обычного пользователя есть настоящая оболочка для входа и домашний каталог.

У каждого пользователя есть числовой идентификатор пользователя, называемый UID. Если не указано при создании нового пользователя с useradd командой, то UID будет автоматически выбрано из /etc/login.defs файла в зависимости от UID_MIN и UID_MIN значений.

Для проверки UID_MIN и UID_MIN значения на вашей системе, можно использовать следующую команду:


Из приведенного выше вывода видно, что все обычные пользователи должны иметь UID от 1000 до 60000. Зная минимальное и максимальное значение, мы можем запросить список всех обычных пользователей в нашей системе.

Команда ниже перечислит всех обычных пользователей в нашей системе Linux:




Ваша система UID_MIN и UID_MIN значения могут отличаться, поэтому более общая версия команды выше:


Если вы хотите напечатать только имена пользователей, просто передайте вывод в cut команду:


Вывод

Из этого руководства вы узнали, как составлять список и фильтровать пользователей в вашей системе Linux и каковы основные различия между системными и обычными пользователями Linux.

Те же команды применяются для любого дистрибутива Linux, включая Ubuntu, CentOS, RHEL, Debian и Linux Mint.

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

Если в первой колонке вывода будет стоять буква "i", означающая installed, значит все в порядке.

Данная конструкция сначала вызовет команду ls, которая считает содержимое каталога, а затем передаст результат команде sort, которая отсортирует его по алфавиту (ключ -d указывает использовать алфавит в качестве шаблона).

Другой пример использования команды sort в linux - это сортировка содержимого файла. Отсортируем, например, строки, содержащиеся в файле /etc/passwd, с целью получения имен пользователей по алфавиту:

sort -d /etc/passwd

Но что делать, если вы хотите, используя тот же файл, отсортировать строки уже не по имени пользователя, а, например, по их уникальному идентификатору (UID)? Утилита sort умеет работать и с таблицами - сортировать по столбцу. Вернее изначально, sort как раз и работает с таблицами, вот только в качестве разделителя она по-умолчанию использует пробел и знак табуляции для разделения столбцов, знак переноса строки для разделения строк. Так как файл /etc/passwd использует ":" для разделения столбцов, то этот символ нужно передать sort при помощи ключа "-t" явно, а далее просто указать номер столбца с помощью ключа "-k". Но только ничего не получится, если опять же не указать шаблон. В данном случае нам понадобиться сортировать числа - поэтому вместо "-d" (по алфавиту) стаим -n (по числам). Вот, что получилось:

sort -n -t : -k 2,2 /etc/passwd

Внимательный читатель спросит: "Почему в качестве параметра ключа "-k" мы указали не просто номер столбца, а номер столбца через запятую с его же номером?". Ответ прост. Ключ "-k" очень мощный. Он позволяет гибко выбирать сортируемое поле. Используя предыдущий пример, немного изменим параметры ключа "-k":

sort -n -t : -k 2.2,2.4 /etc/passwd

Добавив точку, мы тем самым сузили диапазон для проведения сортировки. Теперь команда расшифровывается так: отсортируй содержимое файл /etc/passwd, приняв в качестве исходных данных символ со второго по четвертый во 2-ом столбце.

Приведем еще один классный пример. Представим, что у нас закончилось место в разделе /home, и мы хотим узнать 10 самых объемных каталогов и файлов внутри /home с целью понять, куда копать:

du -a /home | sort -n | tail

На этом возможности команды soft не исчерпываются. Полезным может оказаться ключ "-r", позволяющий сортировать строки в обратном порядке. Его не стоит путать с ключом "-R", который совершенно случайным образом сортирует содержимое файла или вывода программы. Должно быть такая функция тоже кому-то будет полезной.

Также стоит обратить ваше внимание на ключ "-u", который заставляет sort выводит только уникальные значения. Т.е., если при сортировке выяснится, что сортируемые значения одинаковы, будет выведено только то, которое первым попало в поле зрения sort. Ключ "-u" не работает для значений, например "1" и " 1" (один и пробел один), так как пробел тоже считается символом. Чтобы этого избежать применяют ключ "-b", позволяющий игнорировать пробелы перед сортируемой строкой.

Я очень новичок в awk и пытаюсь отсортировать пятую группу моих имен пользователей, в которой есть "Zack e" в алфавитном порядке. Я набрал getent passwd в моем terminal, которые являются:

Я тоже попробовал этот подход

Но все, что он сделал, это отсортировал первую группу вместо желаемой. Как я могу совместить свой подход со сценарием awk все, что я знаю, чтобы сделать в awk, это BEGIN $5 == 1000

Есть ли какой-нибудь способ переставить жетоны так, чтобы сортировка могла работать, а затем вернуть их в порядок?

2 ответа

Я использовал функцию sorted() для сортировки списка кортежей, как показано ниже. выходные данные находятся в порядке убывания, как и требуется для вторых элементов (чисел). но что я действительно хочу, так это отсортировать кортежи в возрастающем алфавитном порядке в случае ничьей. Помогите.

При настройке аутентификации LDAP я столкнулся со следующей проблемой. Я настроил nss в файле nsswitch.conf следующим образом: passwd: ldap файлов группа: файлы тень: файлы Когда я даю следующую команду: getent passwd перечислены все пользователи, включая локальных и ldap пользователей: getent.

Почему 'awk', когда 'sort' может выполнять эту работу элегантно?

Использование порядка сканирования GNU awk и for для сортировки на выходе, когда $5 является уникальным для каждой записи:

Поскольку ключ hash равен $5 , он должен быть уникальным, чтобы избежать коллизий. Если они не уникальны, я думаю, что в этом случае, когда записи уникальны, вы могли бы:

Тогда, конечно, есть функции asort и asorti , которые сортируют массивы, где, как в приведенных выше примерах, сортируются на выходе. Например, мы ожидаем, что $5 не будет уникальным:

Похожие вопросы:

Я разрабатываю приложение android, где у меня есть данные на норвежском языке. Теперь мне нужно отсортировать список имен в алфавитном порядке, где имена содержат специальные норвежские символы.

как я могу использовать qsort для сортировки строк в алфавитном порядке массива 2d, который имеет строки для примера, если у меня есть массив из 4 строк и каждая строка имеет строку >=50 символов.

Мне нужно отобразить в алфавитном порядке список имен и фамилий (порядок по фамилии). Проблема в том, что я не могу выполнить запрос ORDER BY in SQL, потому что я получаю своих пользователей ID в.

Я использовал функцию sorted() для сортировки списка кортежей, как показано ниже. выходные данные находятся в порядке убывания, как и требуется для вторых элементов (чисел). но что я действительно.

При настройке аутентификации LDAP я столкнулся со следующей проблемой. Я настроил nss в файле nsswitch.conf следующим образом: passwd: ldap файлов группа: файлы тень: файлы Когда я даю следующую.

Я хочу напечатать количество пользователей в группе с именем менеджеры. getent group managers | awk -F: '' | awk -F, '' Эта строка печатает их логин пользователя,но я хочу.

Я пытаюсь настроить chroot для sftp пользователей, чтобы они могли видеть имена пользователей/групп на ls -l в соответствии с этой статьей . Для этого мне нужно получить вывод команды getent и.

Я должен получить n и создать массив от 1 до n , а затем распечатать подмножества в алфавитном порядке , но цель состоит в том, чтобы создать их в алфавитном порядке (без сортировки массива) .

У меня есть эта строка кода в моем приложении rails 4, = link_to t('first_name'), url_for(sort: users.first_name), style: 'color: white' он сортирует мою таблицу имен пользователей в алфавитном.

Я использую jq для того, чтобы попытаться преобразовать вывод команды bash в json. Однако обращение меня подводит. Используя эту строку: hostname && getent passwd | egrep -v.

Читайте также: