Grep是必不可少的Linux和Unix命令。它用于搜索给定文件中的文本和字符串。换句话说,grep命令在给定文件中搜索包含与给定字符串或词组匹配的行。对于开发人员和系统管理员来说,它是Linux和类Unix系统上最有用的命令之一。让我们瞧瞧怎样在Linux或类Unix系统上使用grep。
教程要求
要求
Linux/Unix/macOS
根权限
不
难度级别
简单的
类别
搜索中
美西时间。阅读时间
10分钟
目录↓
你可晓得?
名称“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上搜索包含文件名中词组的任何行:
grep'word'filename在Linux和Unix中对词组“bar”执行不分辨大小写的搜索:
grep-i'bar'file1在Linux中的当前目录及其所有子目录中查找所有文件中的词组“httpd”:
grep-R'httpd'.搜索并显示字符串'nixcraft'在名为frontpage.md的文件中出现的总次数:
grep-c'nixcraft'frontpage.md
让我们详尽查看所有命令和选项。
复句
警告!egrep和fgrep命令句型自2007年以来已被弃用。从GNUGrep版本3.8开始,调用那些命令如今将向用户发出警告,她们应当分别使用和,grep-E句型grep-F。
句型如下:
grep 'word'文件名
# 在使用 fgrep 时将 PATTERNS 解释为固定字符串,而不是正则表达式 (regex)。
grep -F 'word-to-search' file.txt

grep -F 'pattern'文件名
grep 'word' file1 file2 file3
grep 'string1 string2' 文件名
cat otherfile | grep 'something'
命令 | grep 'something'
命令选项 1 | grep 'data'
grep --color 'data' fileName
grep [ -options ]模式文件名
grep -F [ -options ] words文件
我怎么使用grep在Linux上搜索文件?
在/etc/passwd文件中搜索名为“boo”的用户,输入:
$grepboo/etc/passwd
示例输出:
foo:x:1000:1000:boo,,,:/home/boo:/bin/ksh
我们可以使用fgrep/grep来查找包含特定词组的文件的所有行。比如,要列举当前目录中名为address.txt的文件中包含词组“California”的所有行linux windows,
$grep-FCaliforniaaddress.txt
请运行:“加州化”或“加州化”。为此,-w通过grep/fgrep命令传递该选项以仅获取包含“California”作为整个词组的行:
$grep-F-wCaliforniaaddress.txt
您可以强制grep忽视词组大小写linux安全加固,即匹配boo、Boo、BOO和所有其他与该-i选项的组合。诸如,键入以下命令:
$grep-i”boo”/etc/passwd
最后一个也可以使用cat命令grep-i”boo”/etc/passwd按如下形式运行:
$cat/etc/passwd|grep-i”boo”
怎么递归使用grep
您可以递归搜索linux管道操作,即读取每位目录下的所有文件以查找字符串“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/有线连接 1:addresses1=192.168.1.5;24;192.168.1.2;
您将在单独的一行中见到192.168.1.5的结果,该行后面是在其中找到它的文件的名称(比如/etc/ppp/options)。-hoption可以使用以下方式抑制输出数据中包含文件名:
$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
地址1=192.168.1.5;24;192.168.1.2;
怎样使用grep仅搜索词组
当您搜索boo时,grep将匹配fooboo、boo123、barfoo35等。您可以强制grep命令仅选择这些包含构成整个词组的匹配项的行,即仅匹配boo词组:
$grep-w”boo”file
怎样使用grep搜索2个不同的词
如下使用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/
匹配词组后怎样估算行数
grep可以使用(count)选项报告每位文件的模式匹配次数-c:
$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-vbar/path/to/file
$grep-v'^root'/etc/passwd
显示匹配前后的行
想瞧瞧大赛前的台词吗?尝试将传递给grep-B:类似地,通过将
$grep-BNUM”word”file
$grep-B3″foo”file1
-A
$grep-ANUM”string”/path/to/file
#Display4linesafterdroppedwordmatchedinfirewalllogfile#
$grep-A4″dropped”/var/log/ufw.log
$grep-C4-B5-A6--color'error-code'/var/log/httpd/access_log
…………
...
_out = " /tmp/out.$" curl
-s https://www.kernel.org / > " $ _out " ##################### ## ## grep -A 在这里使用 ## ##################### url = " $(grep -A 2 '' ${_out} | grep -Eo '(http|https) ://[^/" ] +. * xz ')"
gpgurl="${url/tar.xz/tar.sign}"
通知发送“一个新的内核版本($remote)已经发布。”
echo "* 正在下载 Linux 内核(新版本)..."
wget -qc "$url" -O "${dldir}/${file}"
wget -qc "$gpgurl" -O "${dldir}/${gpgurl##*/}"
.....
..
UNIX/Linux管线
grep命令一般与shell管线一起使用。
#dmesg|grep-E'(s|h)d[a-z]'
在这个反例中,显示硬碟设备的名称
#cat/proc/cpuinfo|grep-i'Model'
:

#grep-i'Model'/proc/cpuinfo
型号:30
型号名称:Intel ( R ) Core ( TM ) i7 CPU Q 820 @ 1.73GHz
型号:30
型号名称:Intel ( R ) Core ( TM ) i7 CPU Q 820 @ 1.73GHz
我最喜欢使用grep或egrep命令来过滤yum命令/dpkg命令/apt命令/apt-get命令的输出:
#dpkg--list|greplinux-image
#yumsearchphp|grepgd
#aptsearchmaria|grep-E'server|client'
使用shell管线示例解释Linuxgrep命令
怎么只列举匹配文件的名称?
使用该-l选项列举其内容提到main()的文件名:
$grep-l'main'*.c
或
$grep-Rl'main'/path/to/project/dir/
颜色选项
最后,我们可以强制grep以颜色显示输出linux管道操作,输入:
$grep--colorvivek/etc/passwd
Grep命令实战
其实,该--color选项降低了可读性。诸如,GREP_COLOR环境变量和grep--color=always可以使用如下:
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=alwaysnobody/etc/passwd

据悉,对于默认的蓝色,如今我们可以使用GREP_COLORshell变量定义颜色。不同的颜色可以极大地帮助我们进行视觉搜索。
将grep输出保存到文件
假定您要搜索关键字acl
$grepaclsquid.conf>my-acl.txt

并将输出保存为名为my-acl.txt的文件,之后您须要运行:
$grep-w'^acl'squid.conf>my-acl.txt
使用cat命令/more命令或less命令输出:
$catmy-acl.txt
使用grep搜索特殊字符
想要使用grep搜索[or'或^特殊字符?-F您可以要求grep使用选项或命令将您的输入视为固定字符串fgrep。诸如:
#在文件名中匹配'[xyz]'
fgrep '[xyz]'文件名#deprecated 语法
grep -F '[xyz]'文件名
使用通配符字符
要匹配egrep或特有的字符,请在字符后面grep-E加一个反斜杠()。当不须要特殊模式匹配时,使用grep一般更简单。-F诸如,尝试'foo'通过置于之前进行匹配':
grep -E ''foo'' 输入
在排序中使用fgreporgrep-F当您不须要使用正则表达式进行模式匹配时。
倘若您希望匹配它们,则须要通配符的正则表达式元字符集
有关正则表达式的更多信息和示例,请参阅egrep命令:
.
^
$ [
* { } ( )
. [ $ [ * { } ( )
扩充的正则表达式元字符是:
.
^
$ [
* +
?{ } | ( )
抑制错误信息
您可以通过传递选项告诉grep不要在屏幕上复印出“没有这样的文件或目录”或“权限被拒绝”的错误-s。诸如:or用于抑制有关不存在或不可读文件的错误消息。
$grep-R-i-s'regex'/etc/
$grep-R-i-s'vivek'/etc/
-s--no-messages