如何在Linux上提高文本的搜索效率
本文由 极客范 - minejo 翻译自 Xmodulo。欢迎加入极客翻译小组,同我们一道翻译与分享。转载请参见文章末尾处的要求。
对于系统管理员或程序员来说,当需要在复杂配置的目录中或者在大型源码树中搜寻特定的文本或模式时,grep类型的工具大概是最受欢迎的。
如果grep是你最喜欢的工具之一,那么你可能会更喜欢ack。ack是一个基于Perl的类似于grep的命令行工具,但是搜索速度更快,能力比grep更强。尤其是当你是程序员时,我强烈推荐你使用ack来取代grep。
ack的用法非常适用与代码搜索,因此程序员可以在源码树中进行复杂的查询,而只需要更少的按键。
ack的特性
ack的一些非常强大的特性:
- 默认搜索当前工作目录
- 默认递归搜索子目录
- 忽略元数据目录,比如.svn,.git,CSV等目录
- 忽略二进制文件(比如pdf,image,coredumps)和备份文件(比如foo~,*.swp)
- 在搜索结果中打印行号,有助于找到目标代码
- 能搜索特定文件类型(比如Perl,C++,Makefile),该文件类型可以有多种文件后缀
- 高亮搜索结果
- 支持Perl的高级正则表达式,比grep所使用GNU正则表达式更有表现力。
相比于搜索速度,ack总体上比grep更快。ack的速度只要表现在它的内置的文件类型过滤器。在搜索过程中,ack维持着认可的文件类型的列表,同时跳过未知或不必要的文件类型。它同样避免检查多余的元数据目录。
在Linux上安装ack
尽管在大多数Linux发行版中是ack是标准包,可轻易获得(比如在基于debian的系统中,是ack-grep包,而在基于Redhat的系统中则是ack包),但是与发行版捆绑的ack版本仍然是1.x,而ack2.0已经发布,而且拥有更多特性。
因此我准备在官方网站下载,然后安装ack。
方便的是,ack在官网可可作为一个单独的Perl脚本获得,其中整合了所有需要依赖的模块。因此,你不需要额外安装Perl模块来运行这脚本。
为了在你的Linux系统中安装ack,去官网下载最新版本的ack。在写本文时,最新的版本是2.12
1
2
3
4
|
$ wget http://beyondgrep.com/ack-2.12-single-file
$ sudo mv ack-2.12-single-file /usr/local/bin/ack
$ sudo chmod 0755 /usr/local/bin/ack
|
需要注意的是,在基于Debian的系统中,有一个独立的包也叫ack(汉码转换器)。所以如果你碰巧有使用那个包,那么你就必须重命名ack来避免命名冲突了。
ack的使用案例
1.在当前目录递归搜索单词”eat”,不匹配类似于”feature”或”eating”的字符串:
1
2
|
$ ack -w eat
|
2.搜索有特殊字符的字符串’$path=.’,所有的元字符(比如’$',’.')需要在字面上被匹配:
1
2
|
$ ack -Q '$path=.' /etc
|
3.除了dowloads目录,在所有目录搜索”about”单词:
1
2
|
$ ack about --ignore-dir=downloads
|
4.只搜索包含’protected’单词的PHP文件,然后通过文件名把搜索结果整合在一起,打印每个文件对应的搜索结果:
1
2
|
$ ack --php --group protected
|
5.获取包含’CFLAG’关键字的Makefile的文件名。文件名为*.mk,makefile,Makefile,GNUmakefile的都在考虑范围内:
1
2
|
$ ack --make -l CFLAG
|
6.显示整个日志文件时高亮匹配到的字符串:
1
2
|
$ tail -f /var/log/syslog | ack --passthru 192.168.1.10
|
7.要换取ack支持的文件过滤类型,运行:
1
2
|
$ ack --help-type
|
原文链接: Xmodulo 翻译: 极客范 - minejo
译文链接: http://www.geekfan.net/6881/
[ 转载请保留原文出处、译者和译文链接。]
如何在Linux上提高文本的搜索效率相关推荐
- 如何在Linux上找到包含特定文本的所有文件?
我正在尝试找到一种方法来扫描整个Linux系统,查找包含特定文本字符串的所有文件. 只是为了澄清,我在文件中寻找文本,而不是文件名. 当我查找如何做到这一点时,我遇到了两次这个解决方案: find / ...
- linux上开发应用程序_如何在Linux上安装软件应用程序
linux上开发应用程序 如何在Linux上安装应用程序? 与许多操作系统一样,该问题不仅有一个答案. 应用程序可以来自许多来源-几乎无法计数-每个开发团队都可以以自己认为最佳的方式交付软件. 知道如 ...
- tor 和tor浏览器_如何在Linux上安装和使用Tor浏览器
tor 和tor浏览器 Surf with anonymity using the Tor browser. Here's how to install Tor on a Linux desktop. ...
- linux 当前活动用户,如何在Linux上自动记录所有用户的终端会话活动
如何在Linux上自动记录所有用户的终端会话活动 不久前,我们写了一篇文章,使用script命令记录Linux终端会话活动. 今天,我们还将讨论相同的主题. 但是,本教程允许您自动记录所有用户的终端会 ...
- linux uniq命令_如何在Linux上使用uniq命令
linux uniq命令 Fatmawati Achmad Zaenuri/ShutterstockFatmawati Achmad Zaenuri / Shutterstock The Linux ...
- 如何在Linux上使用VIM进行.Net Core开发
对于在Linux上开发.Net Core的程序员来说, 似乎都缺少一个好的IDE. Windows上有Visual Studio, Mac上有Visual Studio for Mac, 难道Linu ...
- linux下怎么将html换成pdf,如何在Linux上使用PHP将HTML/CSS转换为PDF
我一直试图将html页面转换为PDF,但没有任何运气,我尝试使用wkhtmltopdf(http://code.google.com/p/) wkhtmltopdf /)和虽然下面的命令在终端正确执行 ...
- du -sh 如何找到最大的文件夹_小白必看!手把手教你如何在linux上安装redis数据库...
首先我们要清楚redis是什么? redis是一种非关系型数据库,它与MySQL的这种关系型数据库不同,MySQL是将数据存储在磁盘中,而redis是储存在内存中.一般很多公司都是使用MySQL+re ...
- github 生产环境_如何在GitHub上提高生产力
github 生产环境 by Darren Burns 达伦·伯恩斯(Darren Burns) 如何在GitHub上提高生产力 (How to be more productive on GitHu ...
最新文章
- python os.path模块学习(转)
- php时间戳 今天昨天,php求今天、昨天、明天时间戳的简单实现方法
- Android中的意图匹配--IntentFilter的作用
- python-map函数
- 用栈来实现队列的golang实现
- Linux下各文件夹的含义和用途
- 人事管理系统 数据流图_中国移动集中化人力资源管理系统试点上线成功
- PhoneGap插件开发实例
- datetime sql
- linq 根据指定条件返回集合中不重复的元素
- 成都焱炎 抖音AI大数据 不root 不装xp
- 程序员技能与成长:程序员的必备工具箱(值得收藏)
- 顶级赛事!2021 CCF大数据与计算智能大赛强势来袭~
- 2020期中考试总结
- hihoCoder 1498 Diligent Robots
- 如何输出一个某种编码的字符串?
- 用自己拍的一张照片做海报
- opengl碗状_OpenGLES简单入门
- excel与access结合运用_当excel不够用时,如何利用Access进行数据分析?
- Python爬取喜马拉雅有声小说【转载】
热门文章
- 【转】git hub 使用小结
- GitHub.com上的那些东西你都知道什么意思吗?
- python文本去重函数_python3.4.3下逐行读入txt文本并去重的方法
- HQL写topN、Spark写topN
- 【Python 必会技巧】获取字典中(多个)最大值(value)的键(key)
- 【VIJOS - P1037】搭建双塔(dp)
- *【HDU - 4272 】LianLianKan (dfs 或 状压dp,贪心不行)
- 2.深度学习练习:Logistic Regression with a Neural Network mindset
- jq上传file到php,jQuery文件上传
- java reader_Java之字符输入流,Reader类的简单介绍