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

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

2
задан 12 May 2015 в 09:08

3 ответа

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

getent passwd | awk -F: '$3 > 10 {print $1}'
0
ответ дан 12 May 2015 в 19:08
  • 1
    Извините я не объяснил полностью. Путь для FLAC является каталогом, где Ваши .flac файлы находятся (или подкаталог, Вы хотите преобразовать). И mp3path означает, где Вы хотите свои .mp3 каталоги файлов, которые будут созданы. И у Вас должен быть установленный ffmpeg (я не знаю если it' s значение по умолчанию в Вашем распределении). – ridgy 11 August 2016 в 09:38

Используя 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
ответ дан 12 May 2015 в 19:08
  • 1
    Возможно, существует путь в наутилусе, чтобы сделать щелчок правой кнопкой в определенной папке и выполнить сценарий. Но так или иначе весь mp3s будет преобразован в указанную папку в сценарии, нет в разделенных действительно? – rootsandculture 11 August 2016 в 10:23

РЕШЕНИЕ 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(':') разделит поля каждой строки на :, создание его список полей.

2
ответ дан 12 May 2015 в 19:08
  • 1
    Я все еще должен вручную добавить путь для преобразования, I' m поиск способа сделать это от интерфейса gmusicbrowser, выбирая, какие файлы я хочу преобразовать в то время как I' m слушание, точно так же, как foobar позволяет. Я переместился в ElementaryOS (Базирующийся надежный человек) и поиск похожего способа сделать это. Спасибо за Вашу справку так или иначе. – rootsandculture 11 August 2016 в 10:20

Другие вопросы по тегам:

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