Как составить список пользователей с UID выше 10?

Какие команды можно использовать для отображения всех пользователей, у которых идентификатор (UID) больше 10?

1
задан 12.05.2015, 19:08

3 ответа

Можно проанализировать passwd база данных с помощью awk. В passwd формат, каждая запись является списком полей, разграниченных :, при этом первое поле является именем пользователя и третьим полем, являющимся UID. Так, в awk Вы могли сделать:

getent passwd | awk -F: '$3 > 10 {print $1}'
0
ответ дан 18.04.2019, 00:16
  • 1
    Вы можете просто awk -F ':' '$3 > 10' /etc/passwd. печать является поведением по умолчанию, меньшим количеством ввода – Deniz Tohumcu 12.05.2015, 12:58
  • 2
    @bodhi.zazen как частый пользователь систем LDAP, я не вижу оснований для не использования getent. И я предполагаю, что OP только хочет имя пользователя. – Aman Sharma 12.05.2015, 12:59
  • 3
    через Python, with open(file) as f: for line in f: m = line.split(':'); if int(m[2]) > 10: print(m[0]). Обратите внимание, что это не острота. – Always Sunny 12.05.2015, 18:28

Используя awk:

 awk -F: '{if ($3 > 10) { print $1 ":" $3 } }' /etc/passwd

это перечислит всех пользователей с их связанным UID где UID> 10.

Благодаря примечанию @sadi, для списка только имен пользователей

awk -F: '{if ($3 > 10) {print $1}}' /etc/passwd
0
ответ дан 18.04.2019, 00:16
  • 1
    Это перечисляет все имена пользователей, сопровождаемые столбцом и UID. Однако это перечисляет имена пользователей [только 111]: awk -F: '{if ($3 > 10) {print $1}}' /etc/passwd – Dmitri T 12.05.2015, 20:43
  • 2
    Спасибо @Sadi, но я вставляю UID, чтобы показать каждому Пользователю с его связанным UID – siddharth khandelwal 12.05.2015, 20:45
  • 3
    Я понимаю; я просто хотел добавить примечание, как изменить это в случае, если только имена пользователей требуются - UpVoted;-) – Flerex 12.05.2015, 20:47

РЕШЕНИЕ 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 затем, сопровождаются :.

  • 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(':') разделит поля каждой строки на [1 124], делая это списком полей.

0
ответ дан 18.04.2019, 00:16
  • 1
    Набор IFS=:, и использование read -a, тогда можно использовать ${line[0]} и ${line[2]} непосредственно. – Always Sunny 12.05.2015, 13:07
  • 2
    Большое спасибо @muru.. я не думал он тот путь.. добавление.. – Remy 12.05.2015, 13:08
  • 3
    @heemayl я думаю, что можно попробовать ^[^:]+(?=:[^:]+:(?!(?:\d|10):)), Вы don' t нужно для cut команда. – Always Sunny 12.05.2015, 18:24
  • 4
    Большое спасибо @AvinashRaj.. аккуратный.. добавленный.. – Mykola Zotko 12.05.2015, 22:52

Теги

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