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

linux管道操作_linux管道操作符_linux管道使用

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反转匹配

linux管道使用_linux管道操作符_linux管道操作

您可以使用-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'

linux管道操作符_linux管道操作_linux管道使用

#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

linux管道操作符_linux管道操作_linux管道使用

据悉,对于默认的蓝色,如今我们可以使用GREP_COLORshell变量定义颜色。不同的颜色可以极大地帮助我们进行视觉搜索。

将grep输出保存到文件

假定您要搜索关键字acl

$grepaclsquid.conf>my-acl.txt

linux管道使用_linux管道操作符_linux管道操作

并将输出保存为名为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

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复