“这是我参与更文挑战的第22天,活动详情查看: 更文挑战”
grep 是必不可少的 Linux 和 Unix 命令。 它用于搜索给定文件中的文本和字符串。 换句话说,grep 命令在给定文件中搜索包含与给定字符串或单词匹配的行。 对于开发人员和系统管理员来说,它是 Linux 和类 Unix 系统上最有用的命令之一。 让我们看看如何在 Linux 或类 Unix 系统上使用 grep。
grep 实用程序是一个家族,其中包括用于搜索职责的 grep、egrep 和 fgrep。
对于大多数用途,您需要使用 fgrep,因为它是最快的,并且只查看字符串和单词。 但是,键入 grep 很容易。 因此,看个人喜好。
Linux 和 Unix 中的 grep 命令示例
下面是一些标准的 grep 命令,并附有示例,以帮助您开始在 Linux、macOS 和 Unix 上使用 grep:
- 在 Linux 上搜索包含 filename 中的单词的任何行:
grep 'word' filename
- 在 Linux 和 Unix 中对单词
bar在file1文件中执行不区分大小写的搜索:
grep -i 'bar' file1
- 递归当前目录及其所有子目录中的所有文件,以查找
httpd
grep -R 'httpd'
- 搜索并显示字符串
nixcraft在frontpage.md文件中出现的总次数:
grep -c 'nixcraft' frontpage.md
让我们详细查看所有命令和选项。
基本语法
其语法格式为:
grep 'word' filename
fgrep 'word-to-search' file.txt
grep 'word' file1 file2 file3
grep 'string1 string2' filename
cat otherfile | grep 'something'
command | grep 'something'
command option1 | grep 'data'
grep --color 'data' fileName
grep [-options] pattern filename
fgrep [-options] words file
如何使用 grep 在 Linux 上搜索文件?
在 /etc/passwd 文件中搜索 boo 用户,输入:
grep root /etc/passwd
类似输出
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_cvmsroot:*:212:212:CVMS Root:/var/empty:/usr/bin/false
我们可以使用 fgrep/grep 来查找文件中包含特定单词的所有行。 例如,要列出当前目录中名为 address.txt 的文件中包含单词“California”的所有行,请运行:
fgrep California address.txt
请注意,上面的命令还会返回“California”是其他词的一部分的行,例如“Californication”或“Californian”。 因此,将 -w 选项与 grep/fgrep 命令一起传递,以获取仅包含“California”作为整个单词的行:
fgrep -w California address.txt
您可以强制 grep 忽略单词大小写,即使用 -i 选项匹配 boo、Boo、BOO 和所有其他组合。
例如,键入以下命令:
grep -i "boo" /etc/passwd
其等效于:
cat /etc/passwd | grep -i "boo"
使用说明:
cut 命令从文件的每一行剪切字节、字符或字段并将这些字节、字符或字段写至标准输出。
如果不指定 file 参数, cut 命令将读取标准输入。 必须指定 -b、-c 或 -f 标志之一。
主要参数含义:
-b: 以字节为单位进行分割-c: 以字符为单位进行分割-d: 自定义分隔符进行分割,默认为制表符号-f: 与-d一起使用,用分隔符分割后,指定显示哪些部分-n:取消分割多字节字符,仅和-b标志一起使用。
如何递归地使用grep
您可以递归搜索,即读取每个目录下的所有文件以查找字符串“192.168.1.5”
grep -r "192.168.1.5" /etc/
$ grep -R "192.168.1.5" /etc/
/etc/ppp/options:# ms-wins 192.168.1.50
/etc/ppp/options:# ms-wins 192.168.1.51
/etc/NetworkManager/system-connections/Wired connection 1:addresses1=192.168.1.5;24;192.168.1.2;
您将在单独的一行中看到 192.168.1.5 的结果,前面是找到它的文件的名称(例如 /etc/ppp/options)。 可以使用 -h 选项抑制输出数据中包含文件名,如下所示:
$ grep -h -R "192.168.1.5" /etc/
$ grep -hR "192.168.1.5" /etc/
# ms-wins 192.168.1.50
# ms-wins 192.168.1.51
addresses1=192.168.1.5;24;192.168.1.2;
如何使用grep搜索2个不同的词
使用 egrep 命令如下:
$ egrep -w 'word1|word2' /path/to/file
单词匹配后如何计算行数
grep 可以使用 -c (count) 选项报告每个文件匹配模式的次数:
grep -c 'word' /path/to/file
如何获取匹配行的行号
传递 -n 选项以在输出的每一行之前加上文本文件中获取它的行号:
grep -n 'root' /etc/passwd
12:root:*:0:0:System Administrator:/var/root:/bin/sh
13:daemon:*:1:1:System Services:/var/root:/usr/bin/false
62:_cvmsroot:*:212:212:CVMS Root:/var/empty:/usr/bin/false
如何强制 grep 反转匹配
您可以使用 -v 选项打印反转匹配; 也就是说,它只匹配那些不包含给定单词的行。
例如打印所有不包含单词 bar 的行:
$ grep -v bar /path/to/file
如何显示匹配行前后的行
想在比赛前看到台词吗? 尝试将 -B 传递给 grep:
grep -B NUM "word" file grep -B 3 "foo" file1
同样,通过将 -A 传递给 grep 来显示匹配后的行:
grep -A NUM "string" /pth/to/file
grep -A 4 "dropped" /var/log/ufw.log
我们可以结合这两个选项来获得最有意义的输出:
grep -B 5 -A 6 --color 'error-code' /var/log/httpd/access_log
如何仅列出匹配文件的名称?
使用 -l 选项列出内容提及 main 的文件名:
$ grep -l 'main' *.c
如何使用颜色选项
最后,我们可以强制 grep 以颜色显示输出,输入:
grep --color root /etc/passwd
小结
grep 命令非常通用,许多新的 Linux 或 Unix 用户发现它很复杂。 因此,我建议阅读 grep 手册页吧
让我们总结一下 Unix/Linux 中的 grep 命令中常用导入选项:
| 选项 | 描述 |
|---|---|
-i | 忽略 Linux 和 Unix 上的大小写区别 |
-w | 强制 PATTERN 只匹配整个单词 |
-v | 选择不匹配的行 |
-n | 用输出行打印行号 |
-h | 禁止输出中有文件名 |
-r | 在 Linux 上递归搜索目录 |
-R | 就像 -r 但遵循所有符号链接 |
-l | 仅打印具有匹配行的文件的名称 |
-c | 仅打印每个文件匹配行的总行数 |
--color | 以颜色显示匹配的内容 |
如果还不能满足需求,可以通过 man grep 来具体查看帮助手册。