免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3298 | 回复: 11
打印 上一主题 下一主题

重提问题:awk 某域是否满足某文件的正则匹配 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-23 00:07 |只看该作者 |倒序浏览
假设有一过滤文本 filter.txt 内容为过滤规则的正则表达式或某特定词
cat filter.txt
^\/*.js$
*.jpg$
adtest

样本数据 a.dat 为某段日志
cat a.dat
59.39.253.253 /scripts/js/createAjaxObject.js "aaa"
117.44.45.132 /main/login.do "bbb"
117.68.36.136 /html/3230.html "ccc"
117.44.45.132 /user.jsp "ddd"
222.185.4.1 /logo.jpg "eee"
222.138.185.69 /adtest.shtml "fff"


希望根据filter.txt的过滤规则(也就是说filter.txt可维护,增加规则仅需要增加新正则即可)
将 a.dat 中$2不满足过滤规则的行打印出来

也就是说 希望得到如下数据
117.44.45.132 /main/login.do "bbb"
117.68.36.136 /html/3230.html "ccc"
117.44.45.132 /user.jsp "ddd"

我已经拜读了论坛中关于awk的精采文章,但仍没解决如上问题,请指教,谢谢了!

论坛徽章:
0
2 [报告]
发表于 2008-07-23 00:10 |只看该作者
或者不局限于华丽的awk,意在解决问题,也许是思路僵化进死胡同了。

论坛徽章:
0
3 [报告]
发表于 2008-07-23 00:19 |只看该作者
LZ的意思是得到以117.44.45.132 开头的数据吗?
如下可得:

cat a.dat | sed -n '/^117.44.45.132 /p'

cat a.dat | awk '/^117.44.45.132 /{ print $0 }'

cat a.dat | grep '^117.44.45.132 '

[ 本帖最后由 xwmhmily 于 2008-7-23 00:21 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-07-23 00:29 |只看该作者
原帖由 xwmhmily 于 2008-7-23 00:19 发表
LZ的意思是得到以117.44.45.132 开头的数据吗?
如下可得:

cat a.dat | sed -n '/^117.44.45.132 /p'

cat a.dat | awk '/^117.44.45.132 /{ print $0 }'

cat a.dat | grep '^117.44.45.132 '

看清楚题目再回答。

论坛徽章:
0
5 [报告]
发表于 2008-07-23 00:37 |只看该作者
have a try
  1. grep -vf filter a.dat
复制代码

论坛徽章:
0
6 [报告]
发表于 2008-07-23 00:42 |只看该作者
原帖由 __lxmxn__ 于 2008-7-23 00:37 发表
have a try
grep -vf filter a.dat

这个当然是可以的,但如果第三列包含了需要被过滤的内容呢?
我只想过滤第二列,第三列保持原样 :)

论坛徽章:
0
7 [报告]
发表于 2008-07-23 00:51 |只看该作者
while read line
do
     info=`echo "$line" | awk '{print $2}' | grep -vf filter`

done < a.dat

论坛徽章:
0
8 [报告]
发表于 2008-07-23 00:53 |只看该作者
上帖,点错键了。 见谅。

没有测试;刚学shell。

论坛徽章:
0
9 [报告]
发表于 2008-07-23 00:57 |只看该作者
原帖由 crowsy001 于 2008-7-23 00:51 发表
while read line
do
     info=`echo "$line" | awk '{print $2}' | grep -vf filter`

done < a.dat

这样做会把$1和$3丢掉的

论坛徽章:
0
10 [报告]
发表于 2008-07-23 01:21 |只看该作者
其实有个变通的方法:

使用awk的-f选项

然后把你的规则文件里写成awk脚本
类似:

{
if (
$2 ! ~/正则表达式/  &&
$2 ! ~/正则表达式/  &&
...
$2 ! ~/正则表达式/  )
print $0
}

具体不记得了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP