Linux \ Windows 下的文件内容搜索工具软件

文件内容搜索我希望做到 “随用随开,用完即走”!就像 Linux 下的 grep 一样,好用,有效!在这里,对 Linux 和 Windows 下类似 grep 的搜索工具软件做了一个简单地梳理。

前言

知识爆炸的年代,文件内容搜索真是令人头痛的问题呢!你有没有遇到类似的情况:想起一段话,或者一段代码,似乎在哪里见过,却总想不起来是在哪里见到的。我就经常遇到这样的问题!不知道你是怎么处理的?不要告诉我,你是在 Notepad++ 中 “CTRL+SHIFT+F” 再点击 “查找所有打开文件”,亦或在 VS Code 中 “CTRL+SHIFT+F”,哈哈,这是码农的常见动作!我也经常这么干!但这需要知道项目目录,且只适用于代码和文本文件;对于其他 doc、pdf、tar.gz、zip 等文件就无能为力了。或者用 everything? 听说也支持搜索文件内容?我拿它搜索过文件,当索引较大的时候,everything 启动时 CPU 使用率飙升,这时候除了干等、啥也干不了哇!这也罢了,其实对于 everything 而言,令我最不能接受的是其常驻内存。

文件内容搜索我希望做到 “随用随开,用完即走”!就像 Linux 下的 grep 一样,好用,有效!那么,在 Windows 下有没有类似 “grep” 功能的搜索软件呢?在这里,对 Linux 和 Windows 下类似 grep 的搜索工具软件做了一个简单地梳理,方便使用查询。

1、Unix / Linux grep

Unix / Linux 操作系统下的 grep 是一个命令行工具,用于搜索符合正则表达式的纯文本数据集的行。

举个例子:当你的 VPS 服务器受到攻击的时候,用以下命令可帮你快速找到攻击者的 IP。

# netstat -anltp | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      4944/nginx: worker  
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      4944/nginx: worker  
tcp        0      0 172.16.0.6:443          111.1?.??.??:9973       ESTABLISHED 4944/nginx: worker  
tcp        0      0 172.16.0.6:443          111.1?.??.??:9943       ESTABLISHED 4945/nginx: worker

(以上命令输出中的 IP 已做模糊处理)

这个命令可以列出所有连接到 nginx 服务的远程 IP 和连接状态(LISTEN、ESTABLISHED)。讲一个“辛酸”的笑话,某年某月的某一天,某人的 1 台 VPS 被攻击,其 2 核 CPU 的负载被打压到百分之九十几到 100% 之间,彼时,不要说正常访问,就连敲个字符、回显都要等几秒,上面这条命令敲进去等结果输出都花了几分钟!但等找到 “元凶” 的 IP,果断封禁之后,CPU 负载才陡然地降下来,世界终归平静了。

配套封禁 IP 的命令(CentOS)

# firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='111.1??.??.??' reject" 
success
[root@VM_0_6_centos ~]# firewall-cmd --reload

2、Windows findstr

在 Windows 命令行(CMD)下 `grep` 的等价命令是 `findstr`,作用就是搜索文件中的文本模式(在文件中寻找字符串)。

findstr /? 可在命令提示符下显示帮助。findstr 微软官方参考链接:https://docs.microsoft.com/zh-cn/windows-server/ad...

类似上文中的查找主机当前的 IP 连接情况可以这样做:

λ netstat -na | findstr /C:"ESTABLISHED"
  TCP    192.168.100.16:50199   204.79.197.200:443     ESTABLISHED
  TCP    192.168.100.16:50200   180.163.150.33:443     ESTABLISHED
  TCP    192.168.100.16:50202   180.163.150.41:443     ESTABLISHED
  TCP    192.168.100.16:50210   219.159.87.60:443      ESTABLISHED
  TCP    192.168.100.16:50211   113.96.140.117:443     ESTABLISHED

/C:"ESTABLISHED" 表示使用字符串 "ESTABLISHED" 作为文字搜索字符串。

在当前目录和所有子目录下的每个 .java 文件中搜索 recycleview 这个词,忽略字母大小写,并打印所在行号。

λ findstr /s /i /n recycleview *.java
AnandLin\AndroidMenuDemo\app\src\main\java\com\anand\menudemo\app\ContextMenuActivity.java:52:        //RecycleView对象对onCreateContextMenu实现方案二:
AnandLin\AndroidMenuDemo\app\src\main\java\com\anand\menudemo\app\MainActivity.java:23:    private Button btnRecycleViewContextMode;
AnandLin\AndroidMenuDemo\app\src\main\java\com\anand\menudemo\app\MainActivity.java:49:        btnRecycleViewContextMode = findViewById(R.id.btn_RecycleView_ContextMode);
AnandLin\AndroidMenuDemo\app\src\main\java\com\anand\menudemo\app\MainActivity.java:68:        btnRecycleViewContextMode.setOnClickListener(this);
AnandLin\AndroidMenuDemo\app\src\main\java\com\anand\menudemo\app\MainActivity.java:89:            case R.id.btn_RecycleView_ContextMode:
AnandLin\AndroidMenuDemo\app\src\main\java\com\anand\menudemo\view\RecyclerViewWithContextMenu.java:60:     * 记录当前RecycleView中Item上下文菜单的Postion
^C

如果输出中有乱码,可以通过设置活动代码页编号为 65001 解决:

λ chcp
活动代码页: 936
λ chcp 65001


3、第三方搜索工具软件

1)类似 `grep` 功能的开源搜索工具软件:

  • ripgrep(rg):它是建立在 Rust 的 regex 引擎之上的、面向行的搜索工具。它包含了其他搜索工具的大部分功能,通常速度更快。它还实现了对 .gitignore 的完全支持。
  • GNU grep:老牌的可靠工具。
  • git grep:和 grep 一样,但内置于 git。只在 git 存储库中运行良好。
  • The Silver Searcher (ag):和 ack 一样,但用 C 语言编写,速度更快。读取你的 .gitignore 文件就像 ripgrep。
  • Universal Code Grep (ucg):也像 ack 但用 C++ 语言编写的,只搜索白名单上的文件,不支持读取 .gitignore。
  • The Platinum Searcher (pt):用 Go 语言编写,支持 .gitignore 文件。
  • sift:用 Go 语言编写的,支持 .gitignore 文件,有一个可选的标志,但一般来说更倾向于搜索所有的东西(与此列表中的其他工具不同,除了 grep)。
  • rga:用 Rust 语言编写的。rga 基于 ripgrep 扩展支持了更多的文件类型,可以搜索 pdf、电子书、Office 文档、zip、tar.gz 等。
  • 其他更多......

2)Windows dnGrep

主页:http://dngrep.github.io/

GitHub 链接:https://github.com/dnGrep/dnGrep

dnGrep 是用于 Windows 的图形化 GREP 工具,支持在 Windows 7、8、10 或 Windows 服务器上运行。dnGrep 允许你在文件中进行搜索,并提供易于阅读的结果。使用文本、正则表达式、XPath 和语音查询来搜索文本文件、Word 和 Excel 文档、PDF 和档案。

特性:

  • 在文本文件、Word 和 Excel 文档以及 PDF 中搜索
  • 搜索档案中的文件——zip、7z、rar、jar 等。
  • 使用文本、正则表达式(regex)、XPath 和语音进行搜索
  • 许多搜索过滤器选项
  • 搜索和替换,包括撤销
  • 整个文件预览
  • 右键点击在文件资源管理器中搜索
  • 移动/复制/删除结果文件
  • 在自定义编辑器中打开行结果,如 Notepad++
  • 将搜索模式加入书签以便以后使用
  • 在测试窗口中尝试复杂的搜索
  • 保存搜索结果
  • 浅色和深色主题
  • 更多......

安装很简单,可以从 GitHub 下载安装包进行安装;也可以使用 “Chocolatey”,一句“choco install dngrep” 即可,运行需要 .NET 4.6.2 或更高版本。

执行任务:搜索指定目录中包含有 “recycleview” 的 java 文件。主屏幕截图如下所示:

dnGrep主屏幕界面

dnGrep主屏幕界面

从上图中的搜索结果中可以看到,dnGrep 是搜索到了压缩包 "JiangCloud\pod-master.zip" 和 “Mexicande\EggFlower-master.zip” 中包含有 “recycleview” 的 java 文件。从窗口底部的状态栏可以看到,“搜索完成 - 搜索了 2557 个文件. 找到 8 个文件 花费 1m 46.876s.”。相对于所使用的机器配置(Intel® Core™ i3-3220/16GB)来说,这个查询速度还是可以的。

TIPS:使用 dnGrep 搜索,结合 ”在搜索结果中搜索” 和 “预览文件” 选项,可以实现快速地查找和精准的定位。

3)Windows grepWin

主页:https://tools.stefankueng.com/grepWin.html

GitHub 链接:https://github.com/stefankueng/grepWin

grepWin 是一个简单的搜索和替换工具,可以使用正则表达式来完成其工作。这允许做更强大的搜索和替换。grepWin 使用 boost regex 引擎来完成其工作,使用 Perl 正则表达式语法。

grepWin 需要 Windows 7 SP1 或更高版本。Windows XP 或 Vista 是不支持的!

同样搜索指定目录中包含有 “recycleview” 的 java 文件。主屏幕截图如下所示:

grepWin主屏幕界面(搜索结果为-文件)

grepWin主屏幕界面(搜索结果为“文件”)

grepWin主屏幕界面(搜索结果为-内容)

grepWin主屏幕界面(搜索结果为“内容”)

可以看到 grepWin 可以限定搜索文件的大小。搜索结果可以在 “文件” 或 “内容” 之间进行切换,双击文件可以用默认的文本编辑器打开文件,但遗憾的是其不支持压缩文件。它的搜索速度很快,虽然程序本身没有提供一个量化的指标供参考,同样的任务用了不到 20s 的时间(手机秒表计时)。

与 dnGrep 相比,dnGrep 胜在有一个 “预览文件” 的独立窗口,且关键词可以高亮显示;并支持搜索压缩文件。grepWin 提供了搜索结果在 “文件” 或 “内容” 之间切换的功能,只是 “内容” 为单行。dnGrep 的搜索结构条目可以点击展开,显示带行号的多行内容。

有趣的是,两款软件的图标放大镜倾斜方向一左一右,相映成趣!

dnGrep\grepWin 图标

dnGrep\grepWin 图标"

结论

在这里重点介绍了 Windows 下的图形化搜索软件:dnGrep 和 grepWin,简单易用。对于代码搜索,个人倾向于使用 dnGrep,安装文件大小只有不到 7MB 的、小巧实用的搜索软件,功能设计上更贴合 “码农” 的需求。

至于一些命令行软件如 rg、rga 等,它们的功能更强大、支持更多类型的文件,有这样的应用场景,尽管拿来使用就好,在这里就不多介绍了。

同时,我整理了一份清单:Linux \ Windows 下的 grep 备选软件(https://www.worldlink.com.cn/list/grep-alternative...)。如有兴趣可以了解一下。


To the top