教程:如何在Ubuntu 14.04上使用Ack和Grep

搜索,您将找到。在Linux系统上,有许多搜索工具可用于快速精确地查找某些本地数据.


我们可以使用Digital Ocean的find命令教程" href ="https://www.hostingadvice.com/external/?site=446bc9e98a55bc765badfce49aefe9e585e467ee7fdd065fe32ecfc73fdf79410824a7079171fa4c42ab3b10cc54d651fe0ac21805fea09f5bb463dd40dab693e9549ec22105349b02cead12482fc6c0370fa1598547af28613ee5a77689e3fa894d29fce618bc7f860a1ac9c2b5c02e" 目标="_空白" rel ="没有开瓶器">查找和查找命令以按文件名,类型,时间戳,所有者或大小查找文件。 find命令还可以搜索文件内容,但是在大多数情况下,有一个名为grep的简单工具。如果我们想在文件或目录中搜索一些相关的内容字符串,则可以使用grep命令或其更新的替代ack。.

名称“ grep”代表“G小叶/ [R奇异的 Ë表情/ pint。 “ g”是Unix上“全局搜索”的缩写。 Grep可以用来查看接收到的文件输入是否匹配指定的模式。这样的模式称为正则表达式,您可能在其他软件工具中已经看到过其中的一些。在本教程中,我们将仅使用正则表达式的基础知识,但是请确保在需要时探索它们的“更深层次”。.

当我们将grep的搜索和过滤操作与其他Linux命令结合使用时,grep和类似工具的全部功能才真正发挥作用。.

步骤1:获取一些样本数据文件

要开始使用一些常见的文件数据,请从其Github存储库下载jQuery源代码。.

首先,我们需要安装Git,以便我们可以从Github下载项目:

1个 须藤apt-get install git

现在我们可以将jquery源代码下载到我们的主目录中:

1个
2

光盘〜

git clone https://github.com/jquery/jquery.git

然后,进入我们刚刚下载的目录:

1个 cd jquery

让我们使用ls命令查看此目录中的文件:

1个ls

我们看到了不同文件类型和一些目录的列表:

1个 AUTHORS.txt bower.json构建CONTRIBUTING.md外部Gruntfile.js LICENSE.txt package.json README.md src测试

让我们看看如何在此源代码中找到内容.

步骤2a:使用Grep

Grep已经安装在每个Linux系统上,因此无需手动安装.

Grep命令选项

这是本教程中将使用的grep命令选项的摘要:

  • -一世 区分大小写的字符匹配
  • -[R 递归读取每个目录下的所有文件
  • 显示每个比赛的行号
  • -C 显示比赛计数
  • -v 通过选择不匹配的行来反转匹配
  • 仅打印匹配行的匹配部分,每个部分在单独的输出行上
  • -w 只匹配整个单词

基本范例

如果要查找当前目录中每个文件包含字符串“ John Resig”的文件,请键入:

1个 grep’John Resig’*

结果输出为:

1个
2
3
4
5

AUTHORS.txt:John Resig <[email protected]>

grep:build:是一个目录

grep:外部:是目录

grep:src:是目录

grep:测试:是一个目录

“ *”告诉grep匹配当前目录中的所有文件。如果我们的搜索模式包含任何空格,则需要在搜索字符串周围加上引号(单引号或双引号).

如果要查找当前目录中每个文件包含字符串“ Authors”的文件,请键入:

1个 grep作者*

结果输出为:

1个
2
3
4
5

AUTHORS.txt:作者按第一稿排序.

grep:build:是一个目录

grep:外部:是目录

grep:src:是目录

grep:测试:是一个目录

Grep找到了一个匹配的文件,并打印了与我们的“作者”模式匹配的行。请注意,grep与此处的文件名不匹配,仅与文件内容不匹配.

如果我们改为键入以下内容:

1个 grep作者*

我们会看到一个不同的匹配文件,因为默认情况下grep对字符大小写敏感.

我们可以使用grep命令行-i选项打开不区分大小写的字符匹配,而忽略任何大小写敏感度:

1个 grep -i作者

现在,我们可以看到所有匹配项,而与我们在搜索模式中可以使用的任何字符大小写组合无关.

要在所有目录(在当前目录中)中进行相同的搜索,我们可以添加-r递归选项:

1个 grep -i -r作者*

现在,grep将搜索所有目录及其递归,直到完成.

可以通过组合选项来缩短相同的命令,从而产生相同的结果:

1个 grep -ir作者*

要查看匹配结果的行号,我们添加-n选项:

1个 grep -irn作者*

要在AUTHORS.txt文件中搜索具有“ gmail.com”域的行,请执行以下操作:

1个 grep -i gmail.com AUTHORS.txt

如果要计算上一次搜索的所有匹配项,则可以添加-c选项:

1个 grep -ic gmail.com AUTHORS.txt

我们将看到一个打印的数字,指示匹配的行数.

要反转先前的“ gmail.com”搜索模式,我们将使用-v选项:

1个 grep -iv gmail.com

现在我们看到所有没有“ gmail.com”字符串的行,这是一个非常方便的功能.

我们也可以搜索整个单词匹配。不区分大小写地搜索“ bug”一词。

1个 grep -i -w错误*

-w选项强制我们的模式仅与整个单词匹配,因此包含字符串“ bug”(例如“ bugs”)的单词将不是有效的匹配项.

如果我们想找出在整个源代码中提到“ jquery”一词的次数,则可以使用“|”,然后在wc wordcount命令中加上-l过滤器,因此我们只计算行数,而不计算单词或字符的数量。 -o选项用于在单独的输出行上打印每个匹配的部分,否则我们的计数将不正确.

1个 grep -iro jquery * | wc -l

如果执行返回许多匹配项的搜索,则可以将grep输出传递给更少的匹配项。 Less是一种分页工具,可使用以下任一工具轻松滚动浏览所有输出 , , “向上翻页”或“向下翻页”键或空格键.

1个 grep -ir jquery * |减

我们还可以将几个grep命令链接在一起,以轻松过滤每个先前命令的结果.

1个 grep -ir jquery * | grep -i json |减

进阶范例

要创建更精确的匹配模式,我们将需要使用正则表达式.

例如,假设我们要查找名字为“ Chris”或“ John”的作者,而不是“ Christopher”,“ Christian”或任何其他名字的作者.

1个 grep -E "(^ Chris)|(^ John)" AUTHORS.txt

瞧,我们看到所有姓克里斯(Chris)或约翰(John)的作者.

-E选项告诉grep将我们的搜索模式解释为扩展的正则表达式。该模式包含两个匹配部分“(^ Chris)”和“(^ John)”,它们由管道符号“ |”分开,代表逻辑或函数。如果两个部分中的任何一个匹配,我们将打印结果。为了仅搜索名字,我们使用脱字符号“ ^”表示行首功能。所以我们只希望我们的名称模式在行的开头匹配.

如果您想了解有关将grep与正则表达式结合使用的更多信息,请参阅本教程。掌握正则表达式是一项值得努力的技能.

步骤2b:使用Ack

Ack和grep一样都是搜索工具,但已针对在源代码树中进行搜索进行了优化。 Ack几乎完成了grep的所有工作,但是在以下方面有所不同.

Ack旨在:

  • 默认情况下递归搜索目录
  • 轻松排除某些文件类型或仅搜索某些文件类型
  • 默认情况下,忽略公共版本控制目录。这些目录的名称如下:.git,.gitignore,.svn
  • 默认情况下忽略二进制文件;这些是文件,例如:二进制可执行文件,图像/音乐/视频文件,gzip / zip / tar存档文件
  • 更好地突出显示匹配项,并更清晰地格式化输出

话虽这么说,一种情况是grep通常比ack更快,如果您正在搜索使用正则表达式查找的很大文件.

安装Ack

首先,第一步是在计算机上安装ack工具.

在Ubuntu或Debian机器上,这就像从默认存储库安装实用程序一样简单。该软件包称为ack-grep:

1个
2

sudo apt-get更新

须藤apt-get install ack-grep

该程序是ack-grep还是ack?

该程序的名称为“ ack”。一些打包人员在创建软件包时将其称为“ ack-grep”,因为那里已经有一个名为“ ack”的软件包与该ack无关。如果我们想输入以下命令,可以告诉我们的Linux系统将该命令缩短为“ ack”:

1个 sudo dpkg-divert –local –divert / usr / bin / ack-重命名–add / usr / bin / ack-grep

现在,该工具将响应名称“ ack”,而不是“ ack-grep”。

确认命令选项

这是我们将在他的教程中使用的ack命令选项的摘要:

  • -一世 区分大小写的字符匹配
  • -f–X 仅打印将要搜索的文件,而不实际进行任何搜索,其中“ X”表示文件类型(例如,“ – html”)
  • 不属于任何子目录.
  • -w 只匹配整个单词
  • –type = noX 从搜索中排除某些文件类型,其中“ X”表示要排除的文件类型(例如,“ – type = nophp”表示排除PHP文件)

基本范例

让我们再次在jQuery源代码树上进行一些搜索,以了解ack如何优化代码搜索.

1个 ack -i作者*

我们看到以下结果:

1个
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18岁

RS.txt

1:作者按第一稿排序.

 

bower.json

12: "AUTHORS.txt",

 

外部/嘶嘶声/MIT-LICENSE.txt

18:非侵权在任何情况下,作者或版权持有人均不得

 

外部/qunit/MIT-LICENSE.txt

18:非侵权在任何情况下,作者或版权持有人均不得

 

LICENSE.txt

27:非侵权在任何情况下,作者或版权持有人均不得

 

package.json

10: "网址": "https://github.com/jquery/jquery/blob/master/AUTHORS.txt"

41: "grunt-git-authors": "1.2.0",

将上面的输出与该搜索的grep版本进行比较:

1个 grep -i作者*

我们看到以下结果:

1个
2
3
4
5
6
7
8
9

AUTHORS.txt:作者按第一稿排序.

bower.json: "AUTHORS.txt",

grep:build:是一个目录

grep:外部:是目录

LICENSE.txt:非侵权。在任何情况下,作者或版权持有人均不得

package.json: "网址": "https://github.com/jquery/jquery/blob/master/AUTHORS.txt"

package.json: "grunt-git-authors": "1.2.0",

grep:src:是目录

grep:测试:是一个目录

请注意,默认情况下,ack搜索是如何递归完成的,并且默认情况下,每个匹配项都打印在其自己的行上,并带有行号。格式比较容易阅读,尤其是当匹配项很多时.

当您经常在代码树中搜索时,这些默认值和格式很不错.

不过,Ack可以做的还不止这些。让我们在源代码树中找到所有HTML文件.

1个 ack -f –html

-f选项仅打印将要搜索的文件,而无需实际执行任何搜索。 –html选项是ack的特殊功能。 Ack可以理解许多文件类型,并且通过指定此选项,可以要求它仅搜索HTML文件。.

让我们在所有JavaScript文件中(不区分大小写)搜索“ bug”一词。

1个 ack -i -w –js错误

–js选项告诉ack仅在JavaScript文件中搜索。您可以搜索所有其他类型的文件,例如–php,–python,–perl等。这种基于文件类型的过滤将使您的搜索更快,尤其是在较大的源代码树上.

有时我们不想进行递归搜索。要仅在当前目录中搜索单词“ bug”,我们输入:

1个 ack -n -w错误

-n选项告诉ack不要进入任何子目录.

让我们对“ css”一词进行递归搜索,但排除所有JavaScript文件:

1个 ack -w –type = nojs css

–type = noX选项允许排除ack已知的文件类型,其中“ X”表示要排除的文件类型.

进阶范例

我们与grep一起使用的正则表达式也适用于ack:

1个 确认 "(^ Chris)|(^ John)" AUTHORS.txt

Ack提供的功能远远超过此处显示的内容。有关使用ack的更多信息,请参阅官方文档.

其他类似grep的工具

以下是一些值得探索的其他出色搜索工具:

  • zgrep –可以搜索压缩文件(例如,压缩日志文件)的Grep工具
  • 阿格列普 –类似Grep的工具,支持近似模式
  • q –命令行工具,用于搜索JSON文件并构造结果输出(作为有效JSON)
  • xgrep, xmlgrep, xmlstar –这些是用于搜索XML文件内容的类似命令行工具
  • PDF格式 –用于搜索PDF文件内容的命令行工具
  • git grep – Git版本控制系统的内置搜索工具
Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map