排除正则表达式bash脚本

时间:2012-03-23 16:06:11

标签: regex grep

我想在某些用户名上找到lastlogin。我想要排除任何以qwer *和root开头的内容,但保留user.name

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

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

2 个答案:

答案 0 :(得分:7)

正则表达式不符合你的想法。让我们分解一下:

  • [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或{{1}的任何单个字符}}。
  • * - 捕获 [^root]ro的任何单个字符。

正如您所看到的,这并不完全是您想要的。请尝试以下方法:

t

你在regexp中不能有“不匹配这个组”运算符......这不是常规的。有些实现确实提供了这样的功能,即PCRE和Python的lastlog | egrep -v '^(qwer|root$)' | egrep '^[a-zA-Z]+\.[a-zA-Z]+$' 包。

答案 1 :(得分:3)

这应该是你:

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

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

如果您特别想要User.Name形式的用户名,那么您可以添加:

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