Исключить регулярное выражение bash-скрипт - PullRequest
5 голосов
/ 23 марта 2012

Я хочу найти lastlogin для определенных имен пользователей. Я хочу исключить все, что начинается с qwer * и root, но сохранить что-либо с user.name

Вот то, что у меня уже есть, но последняя часть регулярного выражения не работает. Любая помощь приветствуется.

lastlog | egrep '[a-zA-Z]\.[a-zA-Z]|[^qwer*][^root]'

Ответы [ 2 ]

7 голосов
/ 23 марта 2012

Это регулярное выражение не делает то, о чем вы думаете. Давайте разберемся:

  • [a-zA-Z] - [...] обозначает класс символов. Что у вас есть, значит: a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w , x, y, z (и заглавные версии). Это захватывает один символ ! Это не то, что вы хотите!
  • \. - это период. Нужен обратный слеш, поскольку . означает «любой символ».
  • [a-zA-Z] - то же, что и выше.
  • | - или подписать. Или то, что было раньше, или то, что приходит потом.
  • [^qwer*] - захватывает любой отдельный символ, который не q, w, e, r или *.
  • [^root] - захватывает любой отдельный символ, который не r, o или t.

Как вы видите, это не совсем то, что вы хотели. Попробуйте следующее:

lastlog | egrep -v '^(qwer|root$)' | egrep '^[a-zA-Z]+\.[a-zA-Z]+$'

В регулярных выражениях нельзя использовать оператор "не сопоставлять эту группу" ... Это не регулярно. Некоторые реализации все-таки предоставляют такую ​​функциональность, а именно PCRE и пакет re Python.

3 голосов
/ 23 марта 2012

Это должно сделать вас:

lastlog | egrep -v '^qwer|^root$'

Опция -v для grep дает вам не совпадающие строки, а не совпадающие.

И если вы конкретно хотите только имена пользователейформы User.Name, затем вы можете добавить это:

lastlog | egrep -v '^qwer|^root$' | egrep -i '^[a-z]*\.[a-z]*'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...