С помощью gawk
, из его man-страницы о массивах можно прочитать подробное объяснение.
В большинстве других языков массивы должны быть объявлены перед использованием, в том числе спецификация того, сколько элементов или компонентов они содержат. На сайте такие языки, декларация вызывает непрерывный блок памяти, чтобы быть выделено для такого количества элементов. Обычно индекс в массиве должно быть положительным целым числом. Например, нулевой индекс определяет первый элемент в массиве, который на самом деле хранится в начале блока памяти. В первом индексе указывается второй элемент, который хранится в памяти сразу после первого элемента, и так далее. Так и есть невозможно добавить больше элементов в массив, потому что в нем есть только место. за столько же элементов, сколько указано в декларации. (Некоторые языки допускают произвольные начальный и конечный индексы, например, '15 ... 27' - но При объявлении массива размер массива остается фиксированным)
.....
Массивы в awk различны - они ассоциативны. Это означает, что каждый массив представляет собой набор пар: индекс и соответствующее ему значение элемента массива
Таким образом, можно определить массив без указания его размера:
$ awk 'BEGIN{a[0]=1;a[10]=2;print length(a)}'
2
Это не похоже на perl
, в которых для массива используется смежный блок памяти:
$ perl -le '$a[0]=1;$a[10]=1;print ~~@a'
11
А perl
хэш очень похож на массив gawk
:
$ perl -le '$a{0}=1;$a{10}=1;print ~~keys %a'
2
Потому что массивы gawk
реализуют в виде хэш-таблицы, поэтому вы можете получить доступ к любому элементу массива в постоянное время, независимо от размера массива.
Если вы хотите перечислить пользователей, основной группой которых является somegroup
:
gid=$(getent group somegroup | awk -F : '{print $3}')
getent passwd | awk -F : -v gid="$gid" '$4 == gid'
Этот ответ предполагает наличие не встроенного Linux, так как он полагается на утилиту Glibc getent
.
Вы можете настроить нужные вам поля в выводе, настроив вторую команду awk. Например, чтобы распечатать только их настоящее имя и телефонный номер:
getent passwd | awk -F : -v gid="$gid" '$4 == gid {print $5}'
Если вы хотите перечислить пользователей, которые имеют какую-либо группу
в качестве дополнительной группы, вам нужно сначала получить идентификаторы пользователей из базы данных групп.
usernames=$(getent group somegroup | awk -F : '{print $3 "," $4}')
gid=${usernames%%,*}; usernames=${usernames#*,}
getent passwd | awk -F : -v gid="$gid" -v usernames="$usernames" '
BEGIN {split(usernames, names, /,/); for (name in names) user[name]=1}
name[$1] || $4==gid
'
Вы не можете распечатать пароли пользователей, так как они не хранятся. Вы можете распечатать хэш их паролей, если у вас есть разрешение на доступ к ним. Если ваша база паролей локальная, то хэши паролей находятся в файле /etc/shadow
. Если вы получите список имен пользователей и других полей, вы можете присоединить его к теневому файлу:
… | awk … | join -t : -j 1 - /etc/shadow
#!/bin/bash
cut -d : -f 1 /etc/passwd | while read user
do
# check if user is in specific group
`groups $user` | grep -q <SPECIFICGROUP>
if [ $? -ne 0 ] ; then
continue;
fi
printf "User=${user},password=`awk -F: -v user=$user '$1 == user { print $2 ;} '`"
done
edit: не обрабатывает случай, если имя пользователя является префиксом другого имени пользователя
.Ниже приведена команда, с помощью которой мы можем получить информацию о пользователях в группе и пароль пользователя
#!/bin/bash
echo "enter the groupname"
read g
for user in `getent group $g| awk -F ":" '{print $NF}'| sed "s/,/ /g"`
do
echo $user
sed -n '/'$user'/p' /etc/passwd
done| sed '1i below are list of users in group and users password'