0

嗨,我有一些 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 更快。所以我的问题是有没有办法从 ip.txt 生成一个“长 grep 搜索字符串”?还是有更好的方法来做到这一点

4

1 回答 1

0

当然。一件事是使用 cat 通常效率较低。我建议改用zgrep这里。您可以按如下方式生成正则表达式

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

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

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

zgrep -F -f ip.txt /.../abc.log.gz
于 2018-06-18T06:53:13.050 回答