LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 845|回复: 3

正则表达式中没有AND运算子

[复制链接]
发表于 2006-12-20 15:29:23 | 显示全部楼层 |阅读模式
我是看到

http://linuxsir.cn/bbs/showthread.php?t=286622

这其中
  1. Blickip=`cat /var/log/secure |grep sshd|grep Failed |awk '{ print $11 }'|uniq|sort`
复制代码

明显有个UUOC,但也真不是一个grep就解决问题的。

在这个例子中
  1. grep 'ssh.*Failed' /var/log/secure | grep sshd | grep Failed | awk '{ print $11 }'| uniq| sort
复制代码

是可以的,因为secure log的格式是已知的,固定的。

但如果要在任何文件找出同时包括ssh和Failed两个匹配的行,就不够了。

比如:

Failed login attempts from x.x.x.x: sshd

那么变化一下如何:
  1. grep -E '(sshd.*Failed)|(Failed.*sshd)' file
复制代码

暂时看上去解决问题了,但是,假如我们要在一个文件中找出同时包含good和day两个匹配的行。示例文件如下
  1. 1. Today is a good day.
  2. 2. gooday
  3. 3. goodday
复制代码

显然三行都是匹配的,但grep -E '(good.*day)|(day.*good)'只会打印1和3行。
发表于 2006-12-20 23:09:19 | 显示全部楼层
gooday是一个匹配问题。good.*day的情况下,两个d都是指定的边界,都是必须出现的,不然匹配不上。可以用'(good.*day)|(good*day)'. 还有就是grep —e '()|()'是OR而不是AND. AND似乎没有必要了,因为AND表示在一个匹配记录中必须同时包含两种(或以上)的情况,比如 "gooday is not good day", 然后匹配为good*day && good.*day. 但这种情况正则式自己就能解决了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-22 10:52:58 | 显示全部楼层
那么day good呢?
回复 支持 反对

使用道具 举报

发表于 2006-12-22 13:27:39 | 显示全部楼层
'(good.*day)|(good*day)|(day.*good)' . "day good" 又是完全不同的pattern了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表