原文来自于:http://www.geekfan.net/6881/

对于系统管理员或程序员来说,当需要在复杂配置的目录中或者在大型源码树中搜寻特定的文本或模式时,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上提高文本的搜索效率的更多相关文章

  1. 如何在 Linux 上安装应用程序

    如何在 Linux 上安装应用程序 编译自:https://opensource.com/article/18/1/how-install-apps-linux作者: Seth Kenlon原创:LC ...

  2. 如何在Linux上通过grub添加内核参数

    转自Linux中国 我们可以在linux内核启动时为其提供各种各样的参数.这些参数可以自定义内核默认的行为,或者通知内核关于硬件的配置信息.内核参数应在内核启动时通过引导装载程序,如GRUB或LILO ...

  3. 如何在Linux上使用VIM进行.Net Core开发

    对于在Linux上开发.Net Core的程序员来说, 似乎都缺少一个好的IDE. Windows上有Visual Studio, Mac上有Visual Studio for Mac, 难道Linu ...

  4. 如何在 Linux 上复制文件/文件夹到远程系统?

    从一个服务器复制文件到另一个服务器,或者从本地到远程复制是 Linux 管理员的日常任务之一. 我觉得不会有人不同意,因为无论在哪里这都是你的日常操作之一.有很多办法都能处理这个任务,我们试着加以概括 ...

  5. springboot打成的jar包如何在Linux上持久运行

    一.首先说说在没有springboot的时候,项目是如何部署的? 1.动态web项目 动态web项目部署很方便,基本上上传文件到服务器的tomcat里面的webapps文件夹下即可完成部署.当然了,这 ...

  6. 如何在Linux上清理内存缓存、缓冲与交换空间

    如何在Linux上清理内存缓存.缓冲与交换空间 与其他类型的操作系统一样,GNU/Linux已经有效的实现了内存管理,甚至更加优秀.但是如果任何进程正在吃光你的内存,并且你想清理它,Linux提供了一 ...

  7. 如何在 Linux 上设置密码策略

    https://linux.cn/article-2518-1.html 用户帐号管理是系统管理员最重要的工作之一.而密码安全是系统安全中最受关注的一块.在本教程中,我将为大家介绍如何在 Linux ...

  8. [转帖]如何在Linux上使用命令行查看硬件信息

    如何在Linux上使用命令行查看硬件信息 时间:2016-01-13   作者:admin 分类:新手入门 阅读:126次 http://embeddedlinux.org.cn/emb-linux/ ...

  9. 如何在Linux上创建,列出和删除Docker容器

    本篇文章介绍的内容是关于在Linux机器上创建,列出和删除docker容器,下面我们来看具体的内容. 1.启动Docker容器 使用下面的命令启动新的Docker容器.这将启动一个新的容器,并为你提供 ...

随机推荐

  1. java--map容器的hashcode和equals

    先看一个例子 首先定义一个user类. package com.text.tool; public class User { int id; User(int id) { this.id = id; ...

  2. 对Cookie进行增删改查

    public class CookieServletDemo extends HttpServlet { public void doGet(HttpServletRequest request, H ...

  3. ios开发时候,出现A valid provisioning profile for this executable was not found 错误

    今天一大早起来,做ios的开发,发现了一下错误:A valid provisioning profile for this executable was not found 错误的产生是在开发模式下产 ...

  4. 利用C语言强行点击置灰的按钮

    通常很多情况下,会有这样的事情,就是: 我们在运行某些程序的时候,发现按钮置灰了,比如购买版权或者输入序列号才能够获得访问权限.某个按钮才允许点击. 其实所有的这些东西都是 别的人或者公司利用一些编程 ...

  5. oracle数据库入门

    oracle  数据库入门. 1.数据 2.数据存储的地方:变量 数组 容器 (内存中),文件,数据库(文件) 3.数据库系统:sqlserver 2000   2005  2008  mysql 5 ...

  6. C#三元运算符

    ?:表达式1?表达式2:表达式3如果1为真则执行2,为假执行3

  7. Unity3D 之UGUI 面板

    UGUI中使用面板,可以对一组控件分为一个组. 一个面板里面可以添加一些控件,就如同Html中的<div>一样.

  8. Emit学习(1)-Emit概览

    一.Emit概述 Emit,可以称为发出或者产生.在Framework中,与Emit相关的类基本都存在于System.Reflection.Emit命名空间下.可见Emit是作为反射的一个元素存在的. ...

  9. select random item with weight 根据权重随机选出

    http://eli.thegreenplace.net/2010/01/22/weighted-random-generation-in-python/ 类似俄罗斯轮盘赌

  10. asp.net:repeater嵌套(常用于新闻等在首页归类显示)

    using System;using System.Configuration;using System.Collections.Generic;using System.Linq;using Sys ...