是否可以使用ack(grep替代品)以反向(自下而上)扫描文件中的图案?
现在我正在使用:
tac filename | grep -m1 blablabla
但是一位朋友提到ack可以在不使用tac的情况下做这种事情。我查看了man文件,找不到任何提及此功能的内容(或许我只是愚蠢而且错过了它)。
如果无法执行上述操作,那么进行此类搜索的更有效方法是什么? (找到从文件底部开始的模式的第一个匹配项)
答案 0 :(得分:1)
由于文件存储在磁盘上的方式,以这种面向反向的方式读取文件总是效率低下。文件只是一个线性字节流,可以从文件开头的偏移量访问。一条线不是一个独特的对象;相反,它是由传统字节(或字节对)定义的抽象,称为行结束。第一行是从文件开头到第一行结束的所有内容,第二行是第一行结束到第二行结束之后的所有内容,依此类推。为了反向访问这些行,你仍然需要从头开始扫描整个文件,甚至找到最后一行。
您拥有的命令行可能与您一样好。我不知道ack
会为你做反向行迭代的任何选项,但即使这样做,它只会比让像tac
这样的专用程序处理得更有效率它(差异来自于执行文件I / O本身,而不是具有第二个进程的开销并设置管道的进程间通信)。
答案 1 :(得分:1)
这仅在您以交互方式工作时才有用,但most
(寻呼机)具有反向搜索功能,可以非常快速地获取大文件中的最后一个条目。用法:
most my_big_file
B
跳至文件末尾shift-/
以向后搜索模式,并搜索您想要的内容 - 它将返回文件中的最后一个条目,而不会像使用tac
那样缓慢缓存整个内容。 不幸的是,我目前还没有发现非交互式解决方案。