Какие команды можно использовать для отображения всех пользователей, у которых идентификатор (UID) больше 10?
Можно проанализировать passwd
база данных с помощью awk
. В passwd
формат, каждая запись является списком полей, разграниченных :
, при этом первое поле является именем пользователя и третьим полем, являющимся UID. Так, в awk Вы могли сделать:
getent passwd | awk -F: '$3 > 10 {print $1}'
Используя awk:
awk -F: '{if ($3 > 10) { print $1 ":" $3 } }' /etc/passwd
это перечислит всех пользователей с их связанным UID где UID> 10.
Благодаря примечанию @sadi, для списка только имен пользователей
awk -F: '{if ($3 > 10) {print $1}}' /etc/passwd
РЕШЕНИЕ 1:
Можно использовать:
#!/bin/bash
while IFS= read -r line; do
[[ "$(cut -d: -f3 <<<"$line")" -gt 10 ]] && echo "$line"
done </etc/passwd
Рассмотрение Вас не имеет никакого имени пользователя, содержащего :
.
Если Вы просто хотите имена пользователей:
#!/bin/bash
while IFS= read -r line; do
[[ "$(cut -d: -f3 <<<"$line")" -gt 10 ]] && echo "$(cut -d: -f1 <<<"$line")"
done </etc/passwd
Здесь мы читаем каждую строку /etc/passwd
файл и сравнение третьего поля, разграниченного :
(UID), чтобы проверить, больше ли это, чем 10. Если это верно, мы распечатали строку (или имя пользователя во втором сценарии).
Это было бы намного более простым использованием массива (благодаря muru):
#!/bin/bash
while IFS=: read -a line; do
[[ "${line[2]}" -gt 10 ]] && echo "${line[0]}"
done </etc/passwd
РЕШЕНИЕ 2:
Используя grep
с PCRE:
getent passwd | grep -P '^[^:]+:[^:]+:(?!(?:\d|10):)' | cut -d: -f1
^[^:]+:
будет соответствовать первому полю (имя пользователя) включая запаздывание :
[^:]+:
будет соответствовать второму полю (пароль) включая запаздывание :
(?!(?:\d|10):)
часть хитра, это - нулевая ширина отрицательный предварительный шаблон PCRE (grep -P
), это означает, что нет никакой единственной цифры (\d
) число или номер 10 затем, сопровождаемый a :
.
cut -d: -f1
просто распечатает первое поле (имя пользователя).
Поочередно, можно избежать cut
, при помощи отрицательного предвидения (?!)
в положительном предвидении (?=)
шаблон (благодаря Avinash Raj):
getent passwd | grep -Po '^[^:]+(?=:[^:]+:(?!(?:\d|10):))'
РЕШЕНИЕ 3:
использование python
:
#!/usr/bin/env python2
with open('/etc/passwd') as f:
print '\n'.join([line.split(':')[0] for line in f if int(line.split(':')[2]) > 10])
Здесь мы печатаем имена пользователей, если третье поле является теркой, чем 10. line.split(':')
разделит поля каждой строки на :
, создание его список полей.