嗨,我有一些固件日志的存档,偶尔我需要将它们与一系列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
,该-E
xtend 正则表达式。
但是,我建议您不要这样做。首先,您应该转义放入正则表达式中的字符串。即使您知道ip.txt
确实包含IP地址(例如不受恶意用户控制(,您仍然应该逃避句点。但是,与其建立一个搜索字符串然后对其进行转义,不如使用-F
的字符串和-f
grep
的 ile 功能。然后你会得到简单快速的单行:
zgrep -F -f ip.txt /.../abc.log.gz