使用awk grep和sed的组合从反向文件搜索中获取第一个匹配项的更有效方法是什么

使用awk grep和sed的组合从反向文件搜索中获取第一个匹配项的更有效方法是什么,awk,sed,grep,Awk,Sed,Grep,我正在一个实用程序有限的操作系统上工作。tail、head和tac等实用程序不可用!sed、awk和Grep都是可用的,但是Grep没有在第一次查找后停止的-m选项。请参阅可用选项列表 我的目标是在一个可能很大的log.txt文件中搜索包含字符串的行,可能从末尾开始反向搜索100Mb,然后打印出来。诀窍是操作必须快速:最多不超过3-4秒 我尝试使用sed将文件的内容转换成另一个文件,然后在循环中使用awk和grep搜索10000行的块,但是sed的转换速度太慢,超出了几Mb 我试过了 self.

我正在一个实用程序有限的操作系统上工作。tail、head和tac等实用程序不可用!sed、awk和Grep都是可用的,但是Grep没有在第一次查找后停止的-m选项。请参阅可用选项列表

我的目标是在一个可能很大的log.txt文件中搜索包含字符串的行,可能从末尾开始反向搜索100Mb,然后打印出来。诀窍是操作必须快速:最多不超过3-4秒

我尝试使用sed将文件的内容转换成另一个文件,然后在循环中使用awk和grep搜索10000行的块,但是sed的转换速度太慢,超出了几Mb

我试过了

self.sed\u line\u search=10001
self.sed_cmd=“sed-e:a-e'$q;N;”+str(self.sed_line_search)+“,$D;ba'”
self.awk_cmd=“awk'/Version/{print}”
self.Command=self.sed_cmd+“”+LOGFILE_PATH+“|”+self.awk_cmd+“\n”
尝试次数,最大尝试次数=1,5
当尝试

如果不知道如何在没有grep-m1选项的情况下在第一场比赛中停止,那么每次只看几千行就可以稍微达到这个目标。但是,它不会反向搜索。

不确定您是否需要它。它用test搜索所有行,并在reveres中打印它们

cat file
dfsdf
test1
fsdfsdf
fdg
sfdgs
fdgsdf
gsfdg
sfdte
test2
dgsfdgsdf
fdgsfdg
sdfgs
df
test3
sfdgsfdg

awk '/test/ {a[++x]=$0} END {for (i=x;i>=1;i--) print a[i]}' file
test3
test2
test1

不确定你是否想要这个。它用test搜索所有行,并在reveres中打印它们

cat file
dfsdf
test1
fsdfsdf
fdg
sfdgs
fdgsdf
gsfdg
sfdte
test2
dgsfdgsdf
fdgsfdg
sdfgs
df
test3
sfdgsfdg

awk '/test/ {a[++x]=$0} END {for (i=x;i>=1;i--) print a[i]}' file
test3
test2
test1

我想你能做的最快的事情是:

grep 'regexp' | sed -n '$p'

我想你能做的最快的事情是:

grep 'regexp' | sed -n '$p'
这可能适用于您(GNU-sed):

将与regexp匹配的行复制到保留空间,并在文件末尾打印保留空间。

这可能适用于您(GNU-sed):


将与regexp匹配的行复制到保留空间,并在文件末尾打印保留空间。

反向文件搜索的第一个匹配--这是文件中最后一个匹配的说法吗?是的,这是一个典型的例子,描述你认为需要做什么,而不是描述需要做什么。我喜欢使用
split
将文件分成更小的部分,然后使用
rev
plus
gawk
。另外,根据GNX文档,
tail
是可用的,所以我肯定会使用它。@Shawn:文件中的最后一个匹配项向我建议,我必须搜索返回最后一个匹配项的整个文件。反向执行返回第一个匹配项的操作似乎更有效。@Marco:omg!尾巴是可用的。好的,我将尝试一些带尾部的解决方案。同时,。我知道我在这里遇到的第一个问题是,我想返回文件中的最后一个匹配项。使用tail,我可以指定类似“最后10000行和字符串的grep,但我只想要最后一行。反向文件搜索的第一个匹配--这是文件中最后一个匹配的说法吗?是的,这是一个典型的例子,描述你认为需要做什么,而不是描述需要做什么。我喜欢使用
split
将文件分成更小的部分,然后使用
rev
plus
gawk
。另外,根据GNX文档,
tail
是可用的,所以我肯定会使用它。@Shawn:文件中的最后一个匹配项向我建议,我必须搜索返回最后一个匹配项的整个文件。反向执行返回第一个匹配项的操作似乎更有效。@Marco:omg!尾巴是可用的。好的,我将尝试一些带尾部的解决方案。同时,。我知道我在这里遇到的第一个问题是,我想返回文件中的最后一个匹配项。使用tail,我可以指定类似“最后10000行和字符串的grep,但我只想要最后一行。我喜欢这个答案,非常简单。让我来研究一下正则表达式,它可能是可以接受的答案。尝试一下这个,并从:
grep-e'^.*\b(str_to_find)\b、 *$'Log.txt | sed-n'$p'
和ideas?
\b
是GNU grep扩展,在您使用的有限grep中不太可能工作,因此这可能是您真正的问题。此外,尽管-
*
意味着
零或多个
,因此用
^..*(
).$
包围stru-to-find不会增加任何值-如果str-to-find存在,则该行将打印有或没有这些装饰。str_to_find表示您希望查找字符串而不是regexp-如果是这样,您应该使用
grep-F
,而不仅仅是
grep
。如果您将ed示例输入和预期输出添加到您的问题中,我们可以帮助您了解如何编写regexp。哇,好的,感谢ed的澄清和回答!:获奖候选人:
grep-F str_to_find Log.txt | sed-n'$p'
。Jotne的解决方案在138Mb的文件上花费了37秒。您在同一文件上的解决方案花费了9秒。欢迎光临。Jotne填充数组是因为你对问题的措辞让它听起来像是想反向输出多个值,而不是只输出最后一个值。请尝试打印出最后一个值的等效脚本,我现在将在他的答案下面的评论中发布。我喜欢这个答案,非常简单。让我来尝试一下正则表达式,它可能是可以接受的答案。尝试这个脚本并从以下位置获得任何输出:
grep-e'^.*\b(str_to_find)\b、 *$'Log.txt | sed-n'$p'
和ideas?
\b
是GNU grep扩展,在您使用的有限grep中不太可能工作,因此这可能是您真正的问题。另外,虽然-
*
意味着
零或多