codecamp

Linux命令 ack -比grep好用的文本搜索工具

ack

比grep好用的文本搜索工具

安装

#  ubuntu下要安装ack-grep,因为在debian系中,ack这个名字被其他的软件占用了。
sudo apt-get install ack-grep
#  alpine Linux-apk软件包管理器 安装 ack
apk install ack

语法

 ack [选项] PATTERN [文件...]
 ack -f [选项] [目录...]

参数

这些参数在linux上的适用频率是相当高的,尤其是你用vim做为IDE的话

注:带逗号的为不同的输入方式,比如​-a​等效于​--all​。另外,以下并非全部参数列表!

-a ,--all      

#  对所有文件进行操作,无论是什么类型(但仍会跳过blib、CVS等目录)

-c ,--count

#  抑制正常输出;而是为每个输入文件打印匹配行的计数。

#  如果-l有效,它将只显示每个文件中具有匹配行的行数。  

#  如果没有-l,某些行计数可能为零。

# 如果与-h 组合,则ack仅输出一个总计数。

--color , --nocolor

#  --color突出显示匹配的文本。 --nocolor抑制颜色。

#  除非重定向输出,否则默认情况下这是打开的。

#  在 Windows 上,此选项默认关闭,除非安装 了 Win32::Console::ANSI 联机帮助页模块或使用了ACK_PAGER_COLOR 环境变量。

--color-filename=颜色

#  设置用于文件名的颜色。

--color-match=颜色

#  设置用于匹配的颜色。

--color-lineno=颜色

#  设置用于行号的颜色。

-F      

#  只打印要搜索的文件,而不实际进行任何搜索。不得指定 PATTERN,否则将作为搜索路径。

-g      

#  打印相对路径 + 文件名与正则表达式匹配的文件。此选项是-f -G 正则表达式的便捷快捷方式。

#  -f的使用方式详见语法示例第二例

#  选项-i、-w、-v和-Q不适用于此正则表达式。

-G      

#  搜索中只包含匹配正则表达式的路径。    

#  整个路径和文件名与正则表达式匹配,并且正则表达式是 Perl 正则表达式,而不是 shell glob。

#  选项-i、-w、-v和-Q不适用于此正则表达式。

-H , --with-filename

#  打印每个匹配项的文件名。

-h , --no-filename    

#  搜索多个文件时,禁止输出文件名的前缀。

--help  

#  打印简短的帮助声明。

-i , --ignore-case     

#  忽略搜索字符串中的大小写。

#  这仅适用于 PATTERN,不适用于为-g 和-G选项提供的正则表达式。

  

-l ,--files-with-matches

#  只打印匹配文件的文件名,而不是匹配的文本。

-L, --files-without-matches

#  只打印不匹配的文件名。这等效于指定-l和-v。

-n ,--no-recurse

#  不递归到子目录。

-Q ,--literal 

#  引用 PATTERN 中的所有元字符,它被视为文字。

#  这仅适用于 PATTERN,不适用于为-g 和-G选项提供的正则表达式。

-r , -R , --recurse

#  递归到子目录。这是默认设置,只是为了与 grep 兼容。

#  您还可以使用它来关闭--no-recurse。

-v , --invert-match

#  反转匹配:选择不匹配的行

#  这仅适用于 PATTERN,不适用于为-g 和-G选项提供的正则表达式。

--version 

#  显示版本和版权信息。

-w , --word-regexp

#  强制 PATTERN 只匹配整个单词。PATTERN 用\b元字符包装 。

#  这仅适用于 PATTERN,不适用于为-g 和-G选项提供的正则表达式。

特点

ack官网列出了这工具的5大卖点:

  1. 速度非常快,因为它只搜索有意义的东西。
  2. 更友好的搜索,忽略那些不是你源码的东西。
  3. 为源代码搜索而设计,用更少的击键完成任务。
  4. 非常轻便,移植性好。
  5. 免费且开源

实例

在记忆的时候大体上可以分为这几个部分:

Searching 代码搜索

Search output 搜索结果处理

File presentation 文件展示

File finding 文件查找

File inclusion/exclusion 文件过滤

grep常用操作

grep -r 'hello_world' #  简单用法
grep '^hello_world' . #  简单正则
ls -l | grep .py #  管道用法

搜索

简单的文本搜索,默认是递归的。

ack-grep hello
ack-grep -i hello
ack-grep -v hello
ack-grep -w hello
ack-grep -Q 'hello*'

搜索结果处理

对搜索结果进行处理,比如只显示一个文件的一个匹配项,或者xxx

ack-grep --line=1       #  输出所有文件第二行
ack-grep -l 'hello'     #  包含的文件名
ack-grep -L 'print'     #  非包含文件名

输出结果展示

输出的结果是以什么方式展示呢,这个部分有几个参数可以练习下

ack-grep hello --pager='less -R'    #  以less形式展示
ack-grep hello --noheading          #  不显示头文件
ack-grep hello --nocolor            #  不对匹配字符着色

文件查找

没错,它可以查找文件,以省去你要不断的结合find和grep的麻烦,就像linux的思想:一个工具做好一件事。

ack-grep -f hello.py                #  查找全匹配文件
ack-grep -g hello.py$               #  查找正则匹配文件
ack-grep -g hello  --sort-files     #  查找然后排序

文件过滤

文件过滤,个人觉得这是一个很不错的功能。如果你曾经在搜索项目源码时不小心命中日志中的某个关键字的话,你会觉得这个有用。

ack-grep --python hello       #  查找所有python文件
ack-grep -G hello.py$ hello   #  查找匹配正则的文件

参考资料


Linux命令 accept -指示打印系统接受发往指定目标打印机的打印任务
Linux命令 alias -定义或显示别名
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }