Linux/UNIX 中的 grep 命令及其实际示例
Grep 是 Linux 和 Unix 中必不可少的命令。它用于在给定文件中搜索文本和字符串。换句话说,grep 命令在给定文件中搜索包含与给定字符串或单词匹配的行。对于开发人员和系统管理员来说,它是 Linux 和类 Unix 系统上最有用的命令之一。让我们看看如何在 Linux 或类 Unix 系统上使用 grep。
你可知道?
“grep” 这个名字源自于使用 Unix/Linux 文本编辑器 ed 执行类似操作的命令:
grep 实用程序是一个系列,包括用于搜索文件的 grep、(正式名称为 egrep)和(正式名称为 fgrep)。对于大多数用例,fgrep 就足够了,因为它速度快,而且只查找字符串和单词。但是,输入 grep 很容易。因此,这是一个个人选择。
g/re/p
grep -Egrep -F
Linux 和 Unix 中的 grep 命令示例
下面是一些标准的 grep 命令,并通过示例进行说明,帮助您在 Linux、macOS 和 Unix 上开始使用 grep:
- 在 Linux 上搜索 filename 中包含单词的任何行:
grep 'word' filename - 在 Linux 和 Unix 中对单词‘bar’执行不区分大小写的搜索:
grep -i 'bar' file1 - 在 Linux 中,在当前目录及其所有子目录中查找单词“httpd”的所有文件:
grep -R 'httpd' . - 搜索并显示字符串“example”在名为 frontpage.md 的文件中出现的总次数:
grep -c 'example' frontpage.md
让我们详细了解所有命令和选项。
句法
语法如下:
grep 'word' filename # Interpret PATTERNS as fixed strings, not regular expressions (regex) when fgrep used. grep -F 'word-to-search' file.txt grep -F 'pattern' filename 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 grep -F [-options] words file
如何使用 grep 在 Linux 上搜索文件?
在/etc/passswd 文件中搜索名为“boo”的用户,输入:
$ grep boo /etc/passwd
示例输出:
foo:x:1000:1000:boo,,,:/home/boo:/bin/ksh
我们可以使用 fgrep/grep 来查找文件中包含特定单词的所有行。例如,要列出当前目录中包含单词“California”的文件 address.txt 的所有行,请运行:
$ grep -F California address.txt
请注意,上述命令还会返回“California”是其他单词的一部分的行,例如“Californication”或“Californian”。因此,-w使用 grep/fgrep 命令传递选项以仅获取包含“California”作为整个单词的行:
$ grep -F -w California address.txt
您可以强制 grep 忽略单词大小写,即匹配 boo、Boo、BOO 和所有其他带有选项的组合-i。例如,键入以下命令:
$ grep -i "boo" /etc/passwd
最后一项也可以使用cat 命令grep -i "boo" /etc/passwd运行如下:
$ cat /etc/passwd | grep -i "boo"
如何递归使用 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 option:
$ 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 仅搜索单词
当您搜索 boo 时,grep 将匹配 fooboo、boo123、barfoo35 等。您可以强制 grep 命令仅选择包含组成完整单词的匹配项的行,即仅匹配 boo 单词:
$ grep -w "boo" file
如何使用 grep 搜索两个不同的单词
使用 egrep 命令如下:
$ grep -E -w 'word1|word2' /path/to/file
该-E选项打开扩展正则表达式。请勿使用以下弃用的语法:
$ egrep -w 'word1|word2' /path/to/file
忽略大小写
我们可以强制 grep 忽略模式和数据中的大小写区别。例如,当我搜索“bar”时,匹配“BAR”、“Bar”、“BaR”等等:
$ grep -i 'bar' /path/to/file
在此示例中,我将在搜索中包含所有子目录:
$ grep -r -i 'main' ~/projects/
如何计算单词匹配的行数
-cgrep 可以使用(count) 选项报告每个文件中模式匹配的次数:
$ grep -c 'word' /path/to/file
传递该-n选项在每行输出前面加上从中获得该行的文本文件中的行号:
$ grep -n 'root' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash 1042:rootdoor:x:0:0:rootdoor:/home/rootdoor:/bin/csh 3319:initrootapp:x:0:0:initrootapp:/home/initroot:/bin/ksh
强制 grep 反转匹配
您可以使用-v选项来反转匹配;也就是说,它只匹配那些不包含给定单词的行。例如,打印所有不包含单词 bar 的行:
$ grep -v bar /path/to/file
$ grep -v '^root' /etc/passwd
显示匹配前后的行
想要查看匹配项之前的行?尝试将传递-B给 grep:同样,通过将传递给 grep 来
显示匹配项之后的行:
我们可以组合这两个选项来获得最有意义的输出:
这是一个获取 Linux 内核下载 URL 的示例 shell 脚本:
$ grep -B NUM "word" file
$ grep -B 3 "foo" file1
-A
$ grep -A NUM "string" /path/to/file
# Display 4 lines after dropped word matched in firewall log file #
$ grep -A 4 "dropped" /var/log/ufw.log
$ grep -C 4 -B 5 -A 6 --color 'error-code' /var/log/httpd/access_log
....... ... _out="/tmp/out.$$" curl -s https://www.kernel.org/ > "$_out" ####################### ## grep -A used here ## ####################### url="$(grep -A 2 '<td id="latest_button">' ${_out} | grep -Eo '(http|https)://[^/"]+.*xz')" gpgurl="${url/tar.xz/tar.sign}" notify-send "A new kernel version ($remote) has been released." echo "* Downloading the Linux kernel (new version) ..." wget -qc "$url" -O "${dldir}/${file}" wget -qc "$gpgurl" -O "${dldir}/${gpgurl##*/}" ..... ..
UNIX / Linux 管道
grep 命令经常与 shell 管道一起使用。在此示例中,显示硬盘设备的名称:
# dmesg | grep -E '(s|h)d[a-z]'
显示 cpu 型号名称:
# cat /proc/cpuinfo | grep -i 'Model'
但是,上述命令也可以不使用 shell 管道,如下所示:
# grep -i 'Model' /proc/cpuinfo
model : 30 model name : Intel(R) Core(TM) i7 CPU Q 820 @ 1.73GHz model : 30 model name : Intel(R) Core(TM) i7 CPU Q 820 @ 1.73GHz
我最喜欢的用法之一是使用 grep 或egrep 命令来过滤yum 命令/dpkg 命令 / apt 命令/ apt-get 命令的输出:
# dpkg --list | grep linux-image
# yum search php | grep gd
# apt search maria | grep -E 'server|client'
使用 shell 管道示例解释 Linux grep 命令
我如何仅列出匹配的文件的名称?
使用-l选项列出内容中提到 main() 的文件名:
$ grep -l 'main' *.c
或
$ grep -Rl 'main' /path/to/project/dir/
颜色选项
最后,我们可以强制 grep 以彩色显示输出,输入:
$ grep --color vivek /etc/passwd
Grep 命令实际作用
GREP_COLOR='1;35' grep --color=always 'vivek' /etc/passwd
GREP_COLOR='1;32' grep --color=always 'vivek' /etc/passwd
GREP_COLOR='1;37' grep --color=always 'root' /etc/passwd
GREP_COLOR='1;36' grep --color=always nobody /etc/passwd
将 grep 输出保存到文件
假设您要搜索关键字 acl 并将输出保存为名为 my-acl.txt 的文件,然后您需要运行:
$ grep acl squid.conf > my-acl.txt
我们可以找到调整搜索并将搜索限制为以名为 acl 的关键字开头的单词:使用cat 命令
$ grep -w '^acl' squid.conf > my-acl.txt
/more 命令或 less 命令
查看最终输出:
$ cat my-acl.txt
使用 grep 搜索特殊字符
想要使用 grep 搜索[或'或特殊字符?您可以使用选项或或命令^让 grep 将您的输入视为固定字符串。例如:
# 在文件名中匹配“[xyz]”-Ffgrep
fgrep '[xyz]' filename #deprecated syntax grep -F '[xyz]' filename
使用\转义字符
要匹配 egrep 或 的特殊字符,请在字符前添加grep -E反斜杠 ( )。当不需要特殊模式匹配时,使用 grep 通常更简单。例如,尝试通过在 之前添加 来进行匹配:\-F'foo'\'
grep -E '\'foo\'' input
当您不需要使用正则表达式进行模式匹配时,请使用fgrep或。grep -F
正则表达式的元字符集,如果你想匹配它们,则需要转义
有关正则表达式的更多信息和示例,请参阅egrep 命令:
. ^ $ [ \ * \{ \} \( \) . [ $ [ \ * \{ \} \( \)
扩展的正则表达式元字符为:
. ^ $ [ \ * + ? { } | ( )
禁止显示错误消息
您可以通过传递选项来告诉 grep 不要在屏幕上打印出“没有这样的文件或目录”或“权限被拒绝”错误-s。例如:
or用于抑制有关不存在或无法读取的文件的错误消息。
$ grep -R -i -s 'regex' /etc/
$ grep -R -i -s 'vivek' /etc/
-s--no-messages
结论
grep 命令用途非常广泛,许多新的 Linux 或 Unix 用户发现它很复杂。因此,我建议您也在 GNU.org 上阅读 grep在线版本。让我们总结一下大多数导入选项:
选项 | 描述 |
---|---|
-i | 忽略 Linux 和 Unix 上的大小写区别 |
-w | 强制 PATTERN 仅匹配整个单词 |
-v | 选择不匹配的行 |
-n | 使用输出行打印行号 |
-h | 抑制输出中的 Unix 文件名前缀 |
-H | 用输出行打印文件名 |
-r | 在 Linux 上递归搜索目录 |
-R | 类似于 -r 但遵循所有符号链接 |
-l | 仅打印选定行的文件名称 |
-c | 仅打印每个文件中选定行的数量 |
--color | 以颜色显示匹配的图案 |
-m NUMBER | 停止 grep 命令选定的 NUMBER 行 |
-o | 仅显示行的匹配部分 |
-B NUMBER | 显示匹配前的 NUMBER 行上下文 |
-A NUMBER | 显示匹配后的 NUMBER 行上下文 |
-C NUMBER | 显示 NUMBER 行输出上下文 |
-s | 告诉 grep 不要在屏幕上打印出“没有这样的文件或目录”或“权限被拒绝”错误 |
如果您喜欢 grep 教程,那么您可能想阅读我们的“ Grep 中的正则表达式”教程。通过键入以下 man 命令阅读 grep 命令手册页:
$ man grep
此外,尝试使用 help 命令了解 grep 用法。例如,查看 Linux 终端中的 grep 命令,看看 ' -E' 或 ' -i' 选项的作用:
$ grep --help | grep -E -w -- '-(E|i)'
- 如何在 Linux / UNIX 中使用 grep 命令
- grep 中的正则表达式
- 使用 grep 命令搜索多个单词/字符串模式
- 如果字符串/单词匹配,则计算行数
- 从文件中 Grep 并显示文件名
- 如何在 UNIX 下按内容查找文件
- grep 命令:仅查看配置文件指令