Вывести отсортированный в алфавитном порядке список имен пользователей в файле passwd
Команда 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.
Читайте также: