在PHP中的Linux的egrep相当于文本文件的目录?

我想在PHP中search文本文件的目录,并列出出现string的所有实例。

在Linux中,我会使用这个:

egrep Cheese textfile_*.txt

有没有在PHP中的function,可以执行此操作没有首先将所有内容附加到数组的复杂性?

如何GREP单词,而不是行,包含特定的字符,并打印整个单词

如何在shell脚本中修改rc.local?

如何将Python应用程序移植到在Windows中正常工作的Linux

在密钥环中Git GPG密码

在GNU / Linux命令行中并行处理

从函数返回值存储char *

bash和ksh之间的子shell差异

spawn:在linux脚本中找不到命令

将.so文件转换为.jnilib文件

Linux进程监控使用Statsd和Graphite

一般情况

我们假设您想要的解决方案可以在任意数量的任意大小的文件内匹配任意长度的字符串,并且您的系统资源是有限的。 这是最有可能的情况,也是最棘手的。

你不能简单地将所有的文件加载到内存中,并将它们作为每个文件的一个大字符串进行搜索,因为这非常耗费内存,而且在功能复杂性方面实际上并不是特别高效(循环所有文件,将它们加载到内存中,然后循环它们再次搜索内容)。

实际上,最好避免将整个文件加载到内存中 – 如果其中一个文件是10GB?

所以,首先,很明显,我们需要获取目录中的文件列表。 有几个方法 – 我看到glob()提到了几次 – 但我会说,这个算法的最佳方法是按顺序读取条目并逐个处理它们,而不是将整个列表加载到一个数组然后迭代它,这在PHP中意味着你要么需要opendir()函数系列,要么迭代器类的DirectoryIterator系列之一。 许多人会认为在现代PHP中,后者是“正确的”方式。

现在,您可以访问目录中的文件列表,您需要访问内容,并且您不需要将整个文件加载到内存中。 在PHP中,这意味着你将要fopen()和(因为这是一个文本文件) fgets() 。 这允许我们一次处理一行文件,因此我们不会一次将多行数据加载到内存中。 它也有一个参数,允许你指定最大的行长度,这可能应该用在文本文件的情况下,无论出于何种原因,包含很少/没有换行符。

所以我们正在处理文件块,我们可以strpos()每个块搜索字符串,对不对? 好吧,差不多。 当搜索字符串跨越两个(或更多)块的边界时会发生什么? 这里开始变得有趣,开始变得更加复杂的字符串搜索算法( Boyer-Moore算法的一个变种可能会在这里很好地为你服务)。

现在唯一要确定的是你想要匹配的具体程度 – 你想要区分大小写吗? 你想原谅空白区别? 你想规范化字符集? 这些问题在你实现你的字符串搜索算法之前必须被回答和考虑。

这种情况的现实是,在PHP中这些复杂性中的一些将会相对缓慢地解决 – 如果你最终一次迭代一个字符串,例如,在C中可以相当快的事情,将成为PHP中真正的性能杀手。

你的情况

…可能不需要这个复杂性。 如果你知道你总是处理少量的小文件,那么简单地使用strpos(file_get_contents())组合方法很可能会很好 – 尽管你不管用什么方法,一次处理一个文件而不是加载它们在执行任何搜索操作之前,所有内容都可能被期望。

从本质上讲,如何实现这一点取决于与您正在使用的环境有关的几个因素 – 但是就资源消耗而言,这样的事情可能是非常危险的,您必须考虑您的代码现在和将来需要如何工作你可以建立正确的解决方案。

有没有在PHP中的功能,可以执行此操作没有首先将所有内容附加到数组的复杂性?

没有一个具体的功能,但PHP有:

RecursiveDirectoryIterator

RecursiveIteratorIterator

RecursiveRegexIterator

GlobIterator

RegexIterator

SplFileInfo

SplFileObject

因为这些都是迭代器,当正确堆叠在一起时,允许你迭代所有匹配的行。

对于你的具体情况,创建一个新的Iterator也许是值得的,它在构造函数中使用类似于egrep的参数,并且在构造函数中进行堆栈/处理,以便为它提供一个简单的接口。

或者可能是一个用于列表的路径/文件/ SplFileInfo作为迭代器,一个用于查找这些线路以保持流畅性。

您也可以在Iterator-Garden中放置一些泛型,就像DecoratingIterator的ExpandingIterator一样,将每个SplFileInfo变成一个SplFileObject。

使用glob函数:

$text_files = glob('directory/*.txt'); foreach($text_files as $text_file) { if (strpos('Cheese',file_get_contents($text_file)) !== false) { echo 'File ',$text_file,' contains "Cheese"<br>'; } }

相关文章

本文从从Bitcask存储模型讲起,谈轻量级KV系统设计与实现。从...
内部的放到gitlab pages的博客,需要统计PV,不蒜子不能准确...
PCM 自然界中的声音非常复杂,波形极其复杂,通常我们采用的...
本文介绍如何离线生成sst并在线加载,提供一种用rocksdb建立...
验证用户输入是否正确是我们应用程序中的常见功能。Spring提...
引入pdf2dom &lt;dependency&gt; &lt;groupId&a...