вывести пользователей с определенным gid

вывести пользователей с определенным gid

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

решение1

Так как вы выполняете поиск по GID, а не по группеимя, и вас интересует тольконачальныйGID для каждого пользователя, это очень просто с Awk.

Формат /etc/passwdописан в man 5 passwd. Процитируем страницу руководства:

   There is one entry per line, and each line has the format:

          account:password:UID:GID:GECOS:directory:shell

Итак, вы хотите напечатать первое поле для каждой строки, гдечетвертыйполе — это то, что передается в ваш скрипт. Где «поля» разделяются двоеточиями.

Лично я бы не стал заморачиваться со скриптом для этого; я бы использовал функцию оболочки. Смотрите:

Итак, все, что вам нужно, это:

  • Понимание -Fвозможности Awk
  • Базовое понимание синтаксиса Awk, котороеcondition {action}
  • Понимание того, как ссылаться на поля при использовании Awk, и
  • Будет полезно, если вы понимаете, как передавать переменные оболочки в Awk; рассмотрите -vвозможность использования Awk.

Проверьте страницу руководства Awk, чтобы получить эти данные.


Я не буду делать за тебя домашнее задание — суть в том, чтобы научитьсякод, а не учиться копировать и вставлять. Но если вы застряли на этом, пожалуйста, прокомментируйте этот вопрос. Я могу добавить немного больше деталей, если нужно. (И через неделю или около того я могу обновить, чтобы включить полное решение.)


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

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

решение2

Это не всегда возможно, поскольку базы данных пользователей не всегда поддаются пересчету.

В passwdбазе данных ( /etc/passwdLDAP, mysql, NIS+ и т. д. или их комбинации) первичным ключом является имя пользователя (несколько пользователей могут иметь одинаковый uid, возможно, с разными gid).

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

Можете попробовать. Стандартной команды для этого нет, но во многих системах есть getentкоманда, которую вы можете использовать.

getent passwd

Вернет список пользователей в виде csv (разделенных двоеточием). Первое поле — имя пользователя, а четвертое — основной gid. Таким образом, если вы знаете gid, вы можете легко вернуть список пользователей, используя awk.

getent -- group "$group"

Запросит базу данных групп для заданных данных $groupи вернет одну строку CSV, где третье поле - это GID. этого cutбудет достаточно для его извлечения.

Если база данных пользователей не является перечисляемой, вы можете попробовать запросить каждый возможный номер uid по отдельности (будьте осторожны, некоторые системы поддерживают uid до 2 31 ), но даже в этом случае нет гарантии, что вы вернете всех возможных пользователей, поскольку на один uid может быть больше одного пользователя, а запросы к базе данных паролей обычно возвращают только одного пользователя.

решение3

#!/bin/sh

if [ $# -ne 1 ]
then
  echo "Usage: $0 gid"
  exit 1
fi

getent passwd | awk -F: -v pgid=$gid '$4 == pgid { print $1 }'

После проверки наличия параметра на наличие ошибок скрипт затем запрашивает базу данных пользователей ( getent passwd) с помощью awk для проверки 4-го поля (идентификатор первичной группы) по идентификатору первичной группы из базы данных групп. Если строка (запись пользователя) совпадает, он печатает первое поле (имя пользователя).

Связанный контент