【linux运维】大型文件查询特定字符串方案总结(如2GB的文本文件)

news/2024/9/15 22:31:52/ 标签: 运维, linux, 服务器

对于大型文件(如2GB的文本文件),直接使用 grep 或其他文本处理工具可能会消耗大量的内存资源。为了更高效地处理这种情况,可以采用以下几种策略:

1. 使用 grep 的性能优化

尽管 grep 是非常高效的工具,但在处理大文件时,还是有一些技巧可以提高性能:

  • 使用 -F 选项:如果要查找的是固定字符串而不是正则表达式,可以使用 -F 选项来加速搜索。
  • 使用 -l 选项:如果你只需要知道哪些文件包含匹配项,而不需要输出匹配的行,可以使用 -l 选项。
  • 使用 -z 选项:对于包含空格或换行符的大文件,使用 -z 选项可以将输入视为由空字符分隔的记录。
grep -Fzl 'example' filename.txt

2. 分块处理

对于非常大的文件,可以考虑将文件分割成较小的部分,然后在每个部分上运行 grep

  • 使用 split 命令分割文件:你可以使用 split 命令将大文件分割成较小的文件。
split -l 1000000 filename.txt # 每个分割后的文件大约包含1百万行

然后对每个分割后的文件运行 grep

for file in x*; do grep -Fzl 'example' "$file"; done

最后合并结果。

3. 使用 awksed

awksed 也可以用来处理大文件,特别是当它们与 split 结合使用时。

awk '/example/ {print NR, $0}' filename.txt

或者使用 sed

sed -n '/example/p' filename.txt

4. 使用多线程或多进程

对于特别大的文件,可以考虑使用多线程或多进程来加速搜索。例如,可以使用 GNU 并行工具 parallel

parallel -j 4 'grep -Fzl {}' :::: files.txt

其中 files.txt 包含要处理的文件列表,-j 4 表示使用4个并行任务。

5. 使用外部工具

除了标准工具外,还有一些专门设计用于处理大文件的工具,例如 ag (The Silver Searcher) 或 ripgrep (rg),这些工具通常比 grep 更快且更适合于大文件搜索。

ag -l 'example' filename.txt

rg -l 'example' filename.txt

6. 使用索引工具

对于经常需要搜索的大文件,可以考虑使用带有索引功能的工具,例如 pt (Pinetree) 或 fd (Find duplicates)。

7. 使用内存映射文件

如果你有足够的物理内存,可以考虑将文件映射到内存中以提高访问速度。不过这种方法可能不适用于非常大的文件,因为可能没有足够的内存来容纳整个文件。

总结

根据具体情况选择适合的方法。对于2GB大小的文件,使用 grepagripgrep 等工具通常已经足够快速。如果需要进一步优化,可以尝试上述提到的其他方法。


http://www.ppmy.cn/news/1505044.html

相关文章

Unity复制对象时让私有变量也被复制的简单方法

Unity复制对象时,如果一个变量为公共变量(public),那么这个变量的值会被复制到新的对象中去,但是如果一个变量是私有变量(private),默认是不会被复制的,如果希望被复制&a…

pytorch学习笔记5 tensor 广播broadcasting

不同shape直接加减,系统会自动做broadcasting操作 先右对齐(小维度对齐) 比如:Feature maps: [4,32,14,14] Bias:[32,1,1] >][1,32,1,1] >[4,32,14,14] 做到与Feature maps的shape相同,才…

【Vulnhub系列】Vulnhub Connect-The-Dots 靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub Connect-The-Dots靶场渗透 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、主机发现 二、端口扫描 PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 2.0.8 or…

C++选择题带答案

(1) 若变量已正确定义并赋值,表达式____不符合C语言语法。 A) a*b/c; B) 3.14%2 C) 2, b D) a/b/c (2) _____是不正确的字符常量。 A)ˊnˊ B) ˊ1ˊ C)"a" D) ˊ101ˊ (3) 在 C 程序中&#xf…

【Python学习手册(第四版)】学习笔记14-迭代器和列表解析(一)

个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 本文主要以通俗易懂的语言介绍迭代器(文件迭代、手动迭代iter和next等),列表解析式包括基础知识包括写法、文件上使用列表解析…

STL-stack容器适配器

目录 一、容器适配器 二、使用 三、模拟实现 一、容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。 STL中,stack是由dequ…

sql注入时,waf屏蔽了information_schema如何处理?

information_schema可代替库 如果使用正则表达式屏蔽了information,则想一想有没有能代替的information的库。 例如:x$schema_table_statistics这个库里面就有table_schema和table_name,但是没有列名,那么列名就需要使用无列名注…

基于FPGA的数字信号处理(20)--半减器和全减器

目录 1、前言 2、半减器 3、全减器 4、减法器 文章总目录点这里:《基于FPGA的数字信号处理》专栏的导航与说明 1、前言 既然有半加器和全加器,那自然也有半减器和全减器了。尽管在电路中减法的实现基本都是 补码 加法 的形式,但是正所谓…

RK3568笔记五十一:W25Q64测试(spi 标准接口 )

若该文为原创文章,转载请注明原文出处。 前面有测试过W25Q64,但那是自己编写的驱动,现在使用内核自带的驱动,只需要通过SPI标准接口,编写应用程序即可以读写W25Q64. 一、硬件原理图 SPI 引脚 功能 MOSI GPIO3_C1 …

LeetCode——572. 另一颗树的子树

通过万岁!!! 题目:给你两棵树,然后问subRoot是不是root的子树。也就是root某个节点的所有孩子节点在值和结构上完全与subRoot相同。思路:我的思路比较简单,就是遍历root,遇到root中…

【vulnhub】Zico2靶机

信息收集 靶机IP发现 进行端口扫描,发现开放了22(ssh),80(http)和111(rpcbind)端口。 进行目录扫描 dirsearch -u http://192.168.93.152 网址IP访问 后面拼接/dbadmin/目录 用弱口…

HarmonyOS鸿蒙应用开发之Text组件的使用

文章目录 示例代码说明Text组件常用属性1. 文本内容2. 字体样式3. 文本对齐4. 布局与边距5. 文本截断与换行6. 其他属性 对比Android的TextView1.基本概念2.属性对比3.小结 注意事项 Text组件在ArkTS中的用法非常灵活,可以通过代码动态地设置文本内容、样式等属性。…

深入理解Shell中的`echo`命令

在Shell脚本编程中,echo命令是最基本的命令之一,用于向终端输出文本。然而,echo的用途远不止于此。本文将深入探讨echo命令的多种用法,包括打印命令执行结果和控制命令执行流程。 echo命令基础 echo命令用于在终端输出字符串或变…

[kimi笔记].net平台

.NET 是一个由微软公司开发的软件开发平台,它的历史可以追溯到2000年左右。.NET 框架最初是为Windows操作系统设计的,但随着时间的发展,微软逐步扩展了.NET 的应用范围,使其可以在多个平台上运行。以下是.NET 几个平台的历史和平台…

简单搭建dns服务器

目录 一.安装服务 二.编写子配置文件 三.编写主配置文件 四.编写文件 五.重启服务测试 配置端:IP地址为172.25.254.100、主机名为node1.rhel9.org 测试端:IP地址为172.25.254.101、主机名为node2.rhel9.org 一.安装服务 [rootnode1 ~]# dnf inst…

未授权访问漏洞系列详解③!

Elasticsearch未授权访问漏洞 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引…

OD C卷 - 石头剪刀布游戏

石头剪刀布游戏 (100) 剪刀石头布游戏,A-石头、B-剪刀、C-布游戏规则: 胜负规则,A>B; B>C; C>A;当本场次中有且仅有一种出拳形状优于其他出拳形状,则该形状的玩家是胜利者,否则认为是…

在Windows编程中,MFC\C++中通过例子来演示如何在OnCopyData中传递STL类型数据?

在Windows编程中,使用MFC框架并通过OnCopyData处理WM_COPYDATA消息来传递STL类型数据,实际上并不直接支持STL容器的直接传递,因为WM_COPYDATA的COPYDATASTRUCT结构期望的是一个指向连续内存块的指针。然而,我们可以通过序列化STL容…

LeetCode Easy|【21. 合并两个有序链表】

力扣题目链接 状态:拿到本题的第一反应就是使用双指针,分别指向两个链表的开头位置。 随后的思路就是以第一条链表为基准完成插入,并且对于遍历到的每个节点都应该保存其状态。 写了一下代码后发现,我们应该以第一个节点较小的链表…

前端需要了解的数据库基础与身份认证

目录 数据库与身份认证数据库的基本概念常见数据库和分类传统型数据库的数据组织结构安装并配置MySQL MySQL的基本使用使用SQL管理数据库SQL中的SELECT语句SQL中的INSERT INTO语句SQL中的UPDATE语句SQL中的DELETE语句SQL中的WHERE子句SQL中的AND和OR运算符SQL中的ORDER BY子句S…