具有大数组的grep文件

具有大数组的grep文件,grep,gzip,zcat,map-files,Grep,Gzip,Zcat,Map Files,嗨,我有一些档案的FW日志,偶尔im需要比较他们与一系列的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]}

嗨,我有一些档案的FW日志,偶尔im需要比较他们与一系列的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++))
#将ip列表输入数组
mapfile-t-O 1 var

它确实可以工作,但它的速度太慢了,我认为grep ping一条包含多个字符串的线路比zcat在每条ip线路上都要快。所以我的问题是,有没有办法从ip.txt生成“长grep搜索字符串”?或者有没有更好的方法来做到这一点

当然。有一点是,使用cat通常效率稍低。我建议在这里使用
zgrep
。您可以生成一个正则表达式,如下所示

IP=`paste -s -d ' ' ip.txt`
zgrep -E "(${IP// /|})" /.../abc.log.gz
第一行将IP地址作为一行加载到
IP
。第二行通过将空格替换为
,构建了一个类似于
(127.0.0.1 | 8.8.8)
的正则表达式。然后它使用
zgrep
abc.log.gz
中搜索一次,并使用
-E
xtended regex

但是,我建议您不要这样做。首先,应该对放入正则表达式中的字符串进行转义。即使您知道
ip.txt
确实包含ip地址(例如,不受恶意用户控制),您仍然应该避开这些句点。但与其构建搜索字符串然后转义它,不如使用
grep
-F
混合字符串和
-F
文件特性。然后您可以得到简单快速的一行:

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

经过一些检查后,显然您需要//而不是让它工作(${IP//|})谢谢,更新了。我测试了原版,它成功了。。。有两个IP地址。您的更改需要支持3+,因为
/
将只替换第一个空格,而不是全部空格(根据需要)。一位朋友提醒我使用了
-F
混合字符串功能。新的解决方案应该更好(虽然从技术上讲它不会“构建搜索字符串”)。请问“FW日志”是什么?
ip.txt
文件的外观如何?
abc.log.gz
看起来怎么样?