具有大数组的 grep 文件



嗨,我有一些固件日志的存档,偶尔我需要将它们与一系列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 搜索字符串"?或者有更好的方法来做到这一点

当然。一件事是使用 cat 通常效率略低。我建议在这里使用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,该-Extend 正则表达式。

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

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

相关内容

  • 没有找到相关文章

最新更新