grep文件有一个大数组

时间:2018-06-18 06:29:08

标签: grep gz zcat map-files

您好我有一些FW日志存档,偶尔我需要将它们与一系列IP地址(其中数千个)进行比较,以获得ip地址匹配的日期和时间。我目前的脚本如下:

#input the list of ip into array
mapfile -t -O 1 var < ip.txt   while true
do
    #check array is not null
    if [[-n "${var[i]}"]] then  
    zcat /.../abc.log.gz | grep "${var[i]}"
    ((i++))

它确实有效,但它的速度太慢了,我认为grep-ping一个包含多个字符串的行将比每个ip行上的zcat更快。所以我的问题是有没有办法生成一个长grep搜索字符串&#39;从ip.txt?还是有更好的方法来做到这一点

1 个答案:

答案 0 :(得分:0)

不确定。有一点是使用猫通常效率不高。我建议您在此处使用zgrep。您可以按如下方式生成正则表达式

IP=`paste -s -d ' ' ip.txt`
zgrep -E "(${IP// /|})" /.../abc.log.gz

第一行将IP地址作为单行加载到IP。第二行通过用(127.0.0.1|8.8.8.8)替换空格来构建类似于|的正则表达式。然后,它使用zgrep使用abc.log.gz xtended正则表达式搜索-E一次。

但是,我建议您不要这样做。首先,您应该将字符串放入正则表达式中。即使您知道ip.txt确实包含IP地址(例如,不受恶意用户控制),您仍应该逃避这些时期。但是,只需使用-F ixed字符串和-f grep ile功能,而不是构建搜索字符串然后将其转义。然后你得到简单快速的单行:

zgrep -F -f ip.txt /.../abc.log.gz