您好我有一些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?还是有更好的方法来做到这一点
答案 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