飘在云端

啊!那蓝真天,白真云!

· 备查Linux · · 290次浏览

grep -v 排除大量关键字列表无效问题

对某个日志进行筛选查找调试内容,因不知道具体目标,需要使用 -v参数进行排除指定关键字,再结合正则 / awk /多重管道筛选过滤:

grep -Eiv '(关键字1|关键字2|关键字3|关键字4|关键字N|......)' test.log | 其他后续筛选操作

可以看到,只需要简单往里面不断添加需要过滤的关键字即可,一直这么用没问题,直到今天继续添加关键字时,发现 grep 直接无输出了。
一开始以为是 grep 对 正则长度 有限制,查询谷歌发现并不是,或者日志文件太大(其实也才 2 GiB +),也不是,甚至还怀疑终端对最大单行输入字符串长度的限制。查询资料中一一否定,还 man grep 看了手册。
折腾一个多小时,虽然查不到原因,但是 grep 手册中一个参数引起我的注意, -f ,从文件中获取匹配模式,如果是因为 grep 对参数长度支持有限,是否可以通过从文件中加载正则来避免,修改后如下:

grep -vif /root/regex.txt test.log | grep xxxx |awk xxxxx| tail -n xxxx

/root/regex.txt 为一个文本文件,里面包含了所有需要排除的关键字,每行一个关键字(以换行符作为 | 识别分割每个关键字),如

abc
adc
ad
apc
tank
gank
......

执行一看,问题解决,推测是 grep -v / grep -E 参数对终端单行输入的参数字符长度的支持有限。