我想从另一个文件的输入中提取日志文件中的某些行。我正在使用这个小命令来做到这一点:
while read line; do
grep "$line" service.log;
done < input_strings.txt > result.txt
input_strings.txt
有大约 50 000 个字符串(每行一个)。对于每个字符串,我目前正在搜索巨大的service.log
文件(大约 2 000 000 行)。
因此,假设第 1 个字符串input_strings.txt
位于service.log
第 10 000 行,这一行被写入 my result.txt
. 之后,input_strings.txt
将在 中搜索的第二个字符串service.log
,但从 的第 1 行开始service.log
。
我怎么能记住我找到第一个条目的最后一行service.log
?这样我就可以在那里开始第二次搜索了?
如果您想获得匹配项,那么您根本不需要使用循环。
grep
只使用一个命令会快得多:也就是说,如果你想按照你在问题中所说的去做,那么你可以使用一个变量来跟踪找到最后一个匹配项的行:
我猜你想搜索第一个关键字,然后在匹配后的行上继续搜索下一个关键字等,随时打印匹配项。
给定
keywords
:并且
data
:这里的
awk
脚本应该做到这一点(用 GNU awk 测试):i
从 0 开始,j
在第一个文件期间(NR==FNR
将当前文件的记录/行号与看到的总行数进行比较),我们将关键字收集到一个数组中。之后,尝试匹配j
:th 关键字,并在匹配时打印并增加j
。找到所有关键字后退出。与 一样
grep
,这里的关键字实际上是正则表达式模式,尽管awk
这里显然是正则表达式。如果要搜索固定字符串,请使用index($0, key)
而不是$0 ~ key
.或者,在开始时不加载关键字:
这应该是直截了当的。