2012-03-23 117 views
3

我想查找某些用户名的lastlogin。我想排除任何以qwer *和root开头的东西,但保留任何与user.name排除正则表达式bash脚本

这是我已经,但正则表达式的最后一部分不起作用。任何帮助赞赏。

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

回答

2

这应该做你:

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

-v选项的grep为您提供了不匹配的行,而不是匹配的。

如果你特别想只有形式User.Name的用户名,那么你可以补充一点:

lastlog | egrep -v '^qwer|^root$' | egrep -i '^[a-z]*\.[a-z]*' 
+0

完美!谢谢! – ibash 2012-03-23 16:36:51

+0

为了避免匹配“rootnot”你可以使用'^ qwer |^root $'或'^(qwer | root $)' – 2012-03-23 17:34:38

+0

Thanks @glenn我编辑了我的答案。 – 2012-03-23 17:40:52

6

这正则表达式不会做你认为它。让我们分解它:

  • [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*] - 捕捉任何单个字符这qwer,或*
  • [^root] - 捕获任何单个字符即而不是r,ot

正如你所看到的那样,这不完全是你要做的。请尝试以下操作:

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

不能在正则表达式中“不匹配这个组”运算符......这并不经常。有些实现确实提供了这样的功能,即PCRE和Python的re包。