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 --help
或ack --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的正则表达式的完整语法。
评论区