【问题标题】:is it possible to scan a file in reverse (bottom up) using ack?是否可以使用 ack 反向(自下而上)扫描文件?
【发布时间】:2015-04-23 02:01:57
【问题描述】:

是否可以使用 ack(grep 替代方法)反向(自下而上)扫描文件中的模式?

我现在正在使用:

tac 文件名 | grep -m1 blablabla

但是有朋友提到 ack 可能不使用 tac 也能做这种事情。我浏览了 man 文件,找不到任何提及此功能的内容(或者我可能只是愚蠢而错过了它)。

如果无法执行上述操作,那么执行此类搜索的更有效方法是什么? (查找从文件底部开始的模式的第一个匹配项)

【问题讨论】:

  • 可以有多个选项。但不知道哪个最有效。例如,对于简单的模式,awk 也可以工作:awk '/blabla/{a=$0};END{print a}' filenametac|grep 相比,tac 可以占用较大的系统内存来存储较大的文件。
  • 不,ack 不能向后读取文件。

标签: bash search grep debian ack


【解决方案1】:

由于文件在磁盘上的存储方式,以这种反向面向行的方式读取文件总是效率低下。文件只是一个线性的字节流,可以通过文件开头的偏移量访问。一条线不是一个独特的对象;相反,它是由称为行尾的常规字节(或字节对)定义的抽象。第一行是从文件开头到第一行结尾的所有内容,第二行是从第一行结尾到第二行结尾的所有内容,依此类推。为了反向访问这些行,您仍然需要从头开始扫描整个文件,甚至找到最后一行。

你所拥有的命令行可能和你能做的一样好。我不知道ack 有任何选项可以为您执行反向行迭代,但即使这样做,它也只会比让tac 之类的专用程序处理它稍微高效一点(区别来自执行文件 I/O 本身,而不是拥有第二个进程的开销并设置管道的进程间通信)。

【讨论】:

  • 公平地说,使用 c/c++ 并且扫描到即使是巨大的文件的末尾也需要可以忽略不计的时间。
  • 没错,但实际上以相反的顺序读取行会引入必须从磁盘重新读取块的复杂性(想象一行从一个磁盘块开始并在下一个块结束)或执行 -应用程序缓存以在读取文件中的前一个块之前保存部分行。这也引入了更多缓存未命中的可能性。
  • 我不明白你的意思,你只会拿一块并把它放在内存中,然后遍历它,然后在那个结束的地方获取下一个块。你的唯一原因如果您使用需要完整行的 getline 之类的东西,就会遇到麻烦。
  • 谢谢,在这种情况下,我可能会坚持使用 tac。我正在使用它来查找日志文件中某个字符串的最后一次出现。
【解决方案2】:

这仅在您以交互方式工作时有用,但most(寻呼机)具有反向搜索功能,可以非常快速地获取大文件中的最后一个条目。用法:

  1. most my_big_file
  2. B 跳到文件末尾
  3. shift-/ 以向后模式进行搜索,然后搜索您想要的内容 - 它会返回文件中的最后一个条目,而不会像 tac 那样缓冲整个内容的缓慢。

很遗憾,我目前不知道非交互式解决方案。

【讨论】:

  • 我以前没有用过 B 键(虽然大多数是我的文本文件阅读器),以后一定要记住这一点,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 2019-02-01
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多