Как я могу зарегистрировать зарегистрированных пользователей без дубликатов?

Нажмите Alt + F2, введите gnome-session-save --logout, затем нажмите enter. Если приложение блокирует выход из системы, попробуйте gnome-session-save --force-logout

7
задан 20 November 2017 в 13:41

3 ответа

Мы можем передать вывод who в awk для печати только первой ячейки каждой записи (строки), а затем передать ее команде sort, которая будет сортировать значения по алфавиту и выводит только уникальные записи -u:

who | awk '{print $1}' | sort -u

Или мы можем использовать только awk следующим образом:

who | awk '!seen[$1]++ {print $1}'

Решение, совместимое с POSIX, предоставляемое таким образом - где cut будет использовать пробелы в качестве разделителя -d' ' и будет печатать только первое поле каждой записи -f1:

who | cut -d' ' -f1 | sort -u

Благодаря @DavidFoerster здесь много более короткий синтаксис, который не потеряет информацию обо всех остальных столбцах:

who | sort -u -k 1,1

Для этих же целей мы могли бы использовать команду w с опцией -h (игнорировать заголовки), например:

w -h | awk '!seen[$1]++ {print $1}'

Мы могли бы использовать также команду users в сочетании с командой rs (изменить данные) с опцией транспонирования -T, а затем снова sort -u:

users | rs -T | sort -u

Мы могли бы использовать и who -q с транспозицией следующим образом: где команда head -1 обрезает только первую строку вывода предыдущей команды:

who -q | head -1 | rs -T | sort -u

См. также:

Как узнать, кто входит в систему с правами root? Как получить список активных сеансов входа?
9
ответ дан 22 May 2018 в 16:05
  • 1
    @dessert: вывод w и who не сортируется по алфавиту, поэтому я намеренно использовал sort -u в первом решении. Кроме того, вывод who -q должен быть транспонирован (как в последнем примере), иначе результат будет неправильным. – pa4080 20 November 2017 в 11:52
  • 2
    Я не думаю, что раздел о сравнении времени полезен. Если у вас нет тысяч зарегистрированных пользователей, время запуска для команд будет намного больше времени, затраченного на обработку и печать результатов. Раздел просто добавляет шум в ответ без какой-либо выгоды. – muru 20 November 2017 в 12:32
  • 3
    @muru, вы правы. Я удалил время сравнения из ответа. – pa4080 20 November 2017 в 12:37

Мы можем передать вывод who в awk для печати только первой ячейки каждой записи (строки), а затем передать ее команде sort, которая будет сортировать значения по алфавиту и выводит только уникальные записи -u:

who | awk '{print $1}' | sort -u

Или мы можем использовать только awk следующим образом:

who | awk '!seen[$1]++ {print $1}'

Решение, совместимое с POSIX, предоставляемое таким образом - где cut будет использовать пробелы в качестве разделителя -d' ' и будет печатать только первое поле каждой записи -f1:

who | cut -d' ' -f1 | sort -u

Благодаря @DavidFoerster здесь много более короткий синтаксис, который не потеряет информацию обо всех остальных столбцах:

who | sort -u -k 1,1

Для этих же целей мы могли бы использовать команду w с опцией -h (игнорировать заголовки), например:

w -h | awk '!seen[$1]++ {print $1}'

Мы могли бы использовать также команду users в сочетании с командой rs (изменить данные) с опцией транспонирования -T, а затем снова sort -u:

users | rs -T | sort -u

Мы могли бы использовать и who -q с транспозицией следующим образом: где команда head -1 обрезает только первую строку вывода предыдущей команды:

who -q | head -1 | rs -T | sort -u

См. также:

Как узнать, кто входит в систему с правами root? Как получить список активных сеансов входа?
9
ответ дан 18 July 2018 в 02:58

Мы можем передать вывод who в awk для печати только первой ячейки каждой записи (строки), а затем передать ее команде sort, которая будет сортировать значения по алфавиту и выводит только уникальные записи -u:

who | awk '{print $1}' | sort -u

Или мы можем использовать только awk следующим образом:

who | awk '!seen[$1]++ {print $1}'

Решение, совместимое с POSIX, предоставляемое таким образом - где cut будет использовать пробелы в качестве разделителя -d' ' и будет печатать только первое поле каждой записи -f1:

who | cut -d' ' -f1 | sort -u

Благодаря @DavidFoerster здесь много более короткий синтаксис, который не потеряет информацию обо всех остальных столбцах:

who | sort -u -k 1,1

Для этих же целей мы могли бы использовать команду w с опцией -h (игнорировать заголовки), например:

w -h | awk '!seen[$1]++ {print $1}'

Мы могли бы использовать также команду users в сочетании с командой rs (изменить данные) с опцией транспонирования -T, а затем снова sort -u:

users | rs -T | sort -u

Мы могли бы использовать и who -q с транспозицией следующим образом: где команда head -1 обрезает только первую строку вывода предыдущей команды:

who -q | head -1 | rs -T | sort -u

См. также:

Как узнать, кто входит в систему с правами root? Как получить список активных сеансов входа?
9
ответ дан 24 July 2018 в 17:42

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

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