Как показать всех пользователей в bash, которые не заканчиваются на "Speci c символов" - PullRequest
1 голос
/ 07 апреля 2020

Все пользователи в system, у которых в именах нет конечного символа a , s , t , r , m , z должны отображаться в Bash.

Имена пользователей можно получить из файла /etc/passwd, в первом колонка. Но я не могу воспринимать правильный подход, чтобы исключить этих персонажей из поиска.

Должен ли я использовать grep? Или просто порез?

Ответы [ 3 ]

3 голосов
/ 07 апреля 2020

Что-то вроде

grep -o '^[^:]*[^astrmz:]:' /etc/passwd | tr -d :

или

cut -d: -f1 /etc/passwd | grep '[^astrmz]$'

[^blah] соответствует любому символу , но перечисленным, противоположным [blah].

GNU grep с использованием lookahead :

grep -Po '^[^:]*[^astrmz:](?=:)' /etc/passwd

Или с использованием awk вместо:

awk -F: '$1 ~ /[^astrmz]$/ { print $1 }' /etc/passwd

или в чистом bash без внешние команды:

while IFS=: read -r name rest; do
  if [[ $name =~ [^astrmz]$ ]]; then
    echo "$name"
  fi
done < /etc/passwd

Как видите, существует множество потенциальных подходов.

1 голос
/ 07 апреля 2020

Простой один вкладыш при использовании bash:

compgen -u | grep -v '[astrmz]$'

Команда compgen -u выдаст список пользователей (без всех дополнительных полей, присутствующих в /etc/passwd); compgen является встроенным в bash, где обычно используется для завершения имени пользователя.

0 голосов
/ 07 апреля 2020

Это должно сработать:

cut -d: -f1 /etc/passwd | grep -vE 's$|t$|r$|m$|z$'

Команда cut удаляет имя пользователя из файла паролей. Затем grep -v (выполняет UNMATCHING), grep -E выполняет многократное сопоставление (ИЛИ ИЛИ ИЛИ) знак $ указывает на последний совпадающий символ

Например, на моей ма c я получаю:

_gamecontrollerd
_ondemand
_wwwproxy
_findmydevice
_ctkd
_applepay
_hidd
_analyticsd
_fpsd
_timed
_reportmemoryexception

(Вы не видите имен, оканчивающихся этими 5 буквами).

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...