侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux ack命令教程:如何高效地搜索源代码(附实例详解和注意事项)

Linux ack命令介绍

ack是一个类似于grep的文本搜索工具,它专门用于搜索源代码。ack的优点是它可以自动识别和过滤掉一些不相关的文件,比如版本控制系统的文件、备份文件、二进制文件等。ack还支持正则表达式和高亮显示匹配的文本。ack的全称是Aho-Corasick-Knuth,是一种字符串匹配算法的缩写。

Linux ack命令适用的Linux版本

ack命令可以在大多数Linux发行版中使用,但是需要先安装ack包。不同的Linux发行版可能有不同的安装命令,例如:

  • 在Debian和Ubuntu中,可以使用sudo apt install ack命令安装。在Debian 9或更早的版本,或者Ubuntu 19.10或更早的版本,需要使用sudo apt install ack-grep命令安装。
  • 在AlmaLinux,CentOS和Fedora中,可以使用sudo dnf install ack命令安装。

如果你不确定你的Linux发行版是什么,可以使用cat /etc/os-release命令查看。以下是一个在Ubuntu 20.04中安装ack的示例:

[linux@bashcommandnotfound.cn ~]$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.3 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.3 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
[linux@bashcommandnotfound.cn ~]$ sudo apt install ack
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  ack
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 61.6 kB of archives.
After this operation, 191 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu focal/universe amd64 ack all 3.3.1-1 [61.6 kB]
Fetched 61.6 kB in 0s (1,122 kB/s) 
Selecting previously unselected package ack.
(Reading database ... 211283 files and directories currently installed.)
Preparing to unpack .../archives/ack_3.3.1-1_all.deb ...
Unpacking ack (3.3.1-1) ...
Setting up ack (3.3.1-1) ...
Processing triggers for man-db (2.9.1-1) ...

Linux ack命令的基本语法

ack命令的基本语法格式如下:

ack [options] PATTERN [FILE...]

其中,PATTERN是要搜索的文本或正则表达式,FILE是要搜索的文件或目录。如果没有指定FILE,则默认搜索当前目录下的所有文件。如果指定了-作为FILE,则从标准输入中读取数据。options是一些可选的参数,用于控制ack的行为和输出。ack的参数有很多,可以使用ack --helpack --man命令查看完整的列表和说明。

Linux ack命令的常用选项或参数说明

ack命令的选项或参数有很多,这里只介绍一些最常用的。如果想了解更多的选项或参数,可以参考ack的手册。

选项或参数说明
-a, --all搜索所有的文件,不管它们的类型
-c, --count只显示每个文件匹配的行数,而不显示匹配的内容
-f只列出要搜索的文件,而不进行搜索
-g REGEX只列出文件名匹配正则表达式REGEX的文件,而不进行搜索
-h, --no-filename不显示文件名
-H, --with-filename显示文件名(默认行为,除非只搜索一个文件)
-i, --ignore-case忽略大小写
-l, --files-with-matches只显示包含匹配的文件,而不显示匹配的内容
-L, --files-without-matches只显示不包含匹配的文件
-n, --no-recurse不递归搜索子目录
-o, --only-matching只显示匹配的部分,而不显示整行
-r, -R, --recurse递归搜索子目录(默认行为)
-s, --no-messages不显示错误信息
-v, --invert-match反向匹配,即显示不匹配的行
-w, --word-regexp只匹配整个单词
-x, --line-regexp只匹配整行
--color, --nocolor开启或关闭高亮显示
--type=TYPE只搜索指定类型的文件,比如perl, python, ruby等
--type-add=TYPE添加自定义的文件类型
--type-set=TYPE重置自定义的文件类型
--[no]ignore-dir=DIR忽略或不忽略指定的目录

Linux ack命令的实例

以下是一些使用ack命令的实例,展示了ack命令的一些常见用法和技巧。

实例1:在当前目录下搜索字符串"hello"

[linux@bashcommandnotfound.cn ~]$ ack hello
hello.txt
1:hello world

hello.py
1:print("hello python")

hello.sh
1:echo "hello shell"

实例2:在指定的文件或目录中搜索字符串"hello"

[linux@bashcommandnotfound.cn ~]$ ack hello hello.txt hello.sh
hello.txt
1:hello world

hello.sh
1:echo "hello shell"

实例3:在当前目录下搜索正则表达式"hello.*"

[linux@bashcommandnotfound.cn ~]$ ack 'hello.*'
hello.txt
1:hello world

hello.py
1:print("hello python")

hello.sh
1:echo "hello shell"

hello.c
1:printf("hello, %s\n", name);

实例4:在当前目录下搜索字符串"hello",并显示匹配的行数

[linux@bashcommandnotfound.cn ~]$ ack -c hello
hello.txt
1

hello.py
1

hello.sh
1

hello.c
1

实例5:在当前目录下搜索字符串"hello",并只显示包含匹配的文件名

[linux@bashcommandnotfound.cn ~]$ ack -l hello
hello.txt
hello.py
hello.sh
hello.c

实例6:在当前目录下搜索字符串"hello",并只显示不包含匹配的文件名

[linux@bashcommandnotfound.cn ~]$ ack -L hello
README.md
LICENSE

实例7:在当前目录下搜索字符串"hello",并忽略大小写

[linux@bashcommandnotfound.cn ~]$ ack -i hello
hello.txt
1:hello world

hello.py
1:print("hello python")

hello.sh
1:echo "hello shell"

hello.c
1:printf("hello, %s\n", name);

HELLO.txt
1:HELLO WORLD

实例8:在当前目录下搜索字符串"hello",并只匹配整个单词

[linux@bashcommandnotfound.cn ~]$ ack -w hello
hello.txt
1:hello world

hello.py
1:print("hello python")

hello.sh
1:echo "hello shell"

这个实例展示了如何使用-w选项,它可以让ack只匹配整个单词,而不是部分匹配。这样可以避免匹配到不想要的结果,比如"hello"和"hello123"。注意,ack使用\b来表示单词边界,所以如果你的字符串包含标点符号,你可能需要使用引号来包裹它,比如ack -w 'hello.'。你可以使用ack --man命令查看ack的正则表达式的完整语法。

实例9:在当前目录下搜索字符串"hello",并只匹配整行

[linux@bashcommandnotfound.cn ~]$ ack -x hello
hello.txt
hello world

实例10:在当前目录下搜索字符串"hello",并反向匹配,即显示不匹配的行

[linux@bashcommandnotfound.cn ~]$ ack -v hello
hello.py
2:print("goodbye python")

hello.sh
2:echo "goodbye shell"

hello.c
2:char *name = "Alice";
3:printf("goodbye, %s\n", name);

HELLO.txt
2:GOODBYE WORLD

实例11:在当前目录下搜索字符串"hello",并只显示匹配的部分,而不显示整行

[linux@bashcommandnotfound.cn ~]$ ack -o hello
hello
hello
hello
hello

实例12:在当前目录下搜索字符串"hello",并使用颜色高亮显示匹配的部分

[linux@bashcommandnotfound.cn ~]$ ack --color hello
hello.txt
1:hello world

hello.py
1:print("hello python")

hello.sh
1:echo "hello shell"

hello.c
1:printf("hello, %s\n", name);

实例13:在当前目录下搜索字符串"hello",并指定文件类型为python

[linux@bashcommandnotfound.cn ~]$ ack --type=python hello
hello.py
1:print("hello python")

实例14:在当前目录下搜索字符串"hello",并添加自定义的文件类型为txt

[linux@bashcommandnotfound.cn ~]$ ack --type-add=txt:ext:txt hello
hello.txt
1:hello world

实例15:在当前目录下搜索字符串"hello",并忽略指定的目录为test

[linux@bashcommandnotfound.cn ~]$ ack --ignore-dir=test hello
hello.txt
1:hello world

hello.py
1:print("hello python")

hello.sh
1:echo "hello shell"

hello.c
1:printf("hello, %s\n", name);

Linux ack命令的注意事项

  • ack命令需要先安装才能使用,如果你在终端中输入ack,可能会看到bash: ack: command not found的错误提示,这时你需要根据你的Linux发行版使用相应的安装命令。
  • ack命令默认会忽略一些不相关的文件和目录,比如版本控制系统的文件、备份文件、二进制文件等,如果你想搜索所有的文件,可以使用-a选项,如果你想搜索特定的文件或目录,可以使用--[no]ignore-dir选项。
  • ack命令支持正则表达式,但是有些正则表达式的语法和grep命令不同,比如在ack中,你需要使用\b来表示单词边界,而不是\<\>,你也需要使用\A\z来表示字符串的开头或结尾,而不是^$。你可以使用ack --man命令查看ack的正则表达式的完整语法。
0

评论区