在Linux中使用Grep命令在文件中搜索文件内容
grep命令" title="grep命令">grep命令的意思是全局正则表达式打印,它是Linux中功能最强大且最常用的命令之一。grep在一个或多个输入文件中搜索与指定模式匹配的行,并将匹配行写入标准输出。如果未指定文件,则grep
从标准输入读取,grep读取的标准输入通常是另一个命令的输出。
在本教程中,我们将通过实际示例向您展示如何使用grep
命令,并详细说明最常用的GNU grep
选项。比如在文件中搜索字符串,反转匹配与排除,grep读取标准输入,递归搜索,仅打印文件名,不区分大小写,搜索全词,显示行号,打印匹配行的前段部分,打印匹配行的后段部分。
Grep命令语法
在开始使用grep
命令之前,让我们先回顾一下基本语法。grep
命令表达式采用以下形式:
grep [OPTIONS] PATTERN [FILE...]
方括号中的选项是可选的。
OPTIONS
-零个或多个选项。 Grep提供了个用于控制其行为的选项。PATTERN
-搜索模式。FILE
-零个或多个输入文件名。
要能够搜索文件,运行命令的用户必须对该文件具有读取权限。
如何使用grep
在文件中搜索字符串
grep
命令的最基本用法是在文件中搜索字符串。例如,要搜索/etc/passwd
文件包含字符串bash
的行,可以使用以下命令:
grep bash /etc/passwd
输出应如下所示:
root:x:0:0:root:/root:/bin/bashmyfreax:x:1000:1000:myfreax:/home/myfreax:/bin/bash
如果字符串包含空格,则需要将其用单引号或双引号引起来:
grep "Gnome Display Manager" /etc/passwd
反转匹配(排除)
要显示与模式不匹配的行,请使用-v
(或--invert-match
)选项。
例如,要显示/etc/passwd
文件中不包含字符串nologin
的行,可以使用以下命令:
grep -v nologin /etc/passwd
root:x:0:0:root:/root:/bin/bashcolord:x:124:124::/var/lib/colord:/bin/false
git:x:994:994:git daemon user:/:/usr/bin/git-shell
myfreax:x:1000:1000:myfreax:/home/myfreax:/bin/bash
如何在其它命令输出中使用Grep搜索字符串
除了指定输入文件,您还可以将另一个命令的输出传递给grep
,然后仅打印与指定模式匹配的行。
例如,要找出系统上以www-data
用户身份运行进程,可以使用以下ps
命令然后管道给grep:
ps -ef | grep www-data
www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool wwwroot 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data
www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process
www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process
您也可以按命令将多个管道链接在一起。如您在上面的输出中看到的,还有一行包含grep
进程。如果您不希望显示该行,则将输出传递到另一个grep
实例,如下所示。
ps -ef | grep www-data | grep -v grep
www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool wwwroot 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data
www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process
www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process
递归搜索
要使用递归搜索模式,请使用-r
选项(或--recursive
)。这将搜索指定目录中的所有文件,并跳过递归遇到的符号链接。要跟踪所有符号链接,请使用-R
选项(或--dereference-recursive
)。
在以下示例中,我们在/etc
目录内的所有文件中搜索字符串myfreax.com
:
grep -r myfreax.com /etc
该命令将打印以文件完整路径为前缀的匹配行。
/etc/hosts:127.0.0.1 node2.myfreax.com/etc/nginx/sites-available/myfreax.com: server_name myfreax.com www.myfreax.com;
使用-R
选项grep
将跟随所有符号链接:
grep -R myfreax.com /etc
注意输出的最后一行。上面的示例中未打印该行,因为Nginx的sites-enabled
目录中的文件是指向sites-available
目录中的配置文件的符号链接。
/etc/hosts:127.0.0.1 node2.myfreax.com/etc/nginx/sites-available/myfreax.com: server_name myfreax.com www.myfreax.com;
/etc/nginx/sites-enabled/myfreax.com: server_name myfreax.com www.myfreax.com;
仅显示文件名
要取消默认的grep
输出并仅打印包含匹配模式的文件名,可以使用-l
(或--files-with-matches
)选项。
例如,在当前工作目录中搜索所有以.conf
结尾的文件,并仅打印包含字符串myfreax.com
的文件的名称:
grep -l myfreax.com *.conf
输出将如下所示:
tmux.confhaproxy.conf
-l
选项通常与递归选项-R
结合使用:
grep -Rl myfreax.com /tmp
不区分大小写的搜索结果
默认情况下,grep
命令区分大小写。这意味着将大写和小写字符视为不同的字符。要在搜索时忽略大小写,请使用-i
选项(或--ignore-case
)。例如,当搜索Zebra
不带任何选项时,以下命令将不显示任何输出:
grep Zebra /usr/share/words
但是,如果使用-i
选项执行不区分大小写的搜索,则它将同时匹配大小写字母:
grep -i Zebra /usr/share/words
zebrazebra's
zebras
搜索全词
搜索gnu时,grep
还将打印gnu嵌入较大字词的行,例如“cygnus”或“magnum”。
grep gnu /usr/share/words
cygnusgnu
interregnum
lgnu9d
lignum
magnum
magnuson
sphagnum
wingnut
要仅返回指定字符串是整个单词的那些行,请使用-w
(或--word-regexp
)选项。单词字符包括字母数字字符(a-z
,A-Z
和0-9
)和下划线(_
)。所有其他字符都被视为非单词字符。
如果使用-w
选项运行与上述相同的命令,则grep
命令将仅返回其中包含gnu
作为单独单词的行。
grep -w gnu /usr/share/words
gnu
显示行号
要显示包含与模式匹配的字符串的行号,请使用-n
(或--line-number
)选项。使用此选项时,grep
将匹配项打印到标准输出,并以找到的行号作为前缀。
例如,要在/etc/services
文件中搜索包含bash
字符匹配的行,可以使用以下命令:
grep -n 10000 /etc/services
以下输出显示了在10423和10424行中找到的匹配项。
10423:ndmp 10000/tcp10424:ndmp 10000/udp
匹配统计
要打印与标准输出匹配的行数,请使用-c
(或--count
)选项。
在以下示例中,我们计算以/usr/bin/zsh
为默认shell的帐户数量。
grep -c '/usr/bin/zsh' /etc/passwd
4
多模式与字符串搜索
可以使用OR运算符|
结合两个或多个搜索模式。默认情况下,grep
将模式解释为基本正则表达式,其中诸如|
之类的元字符会失去其特殊含义,必须使用其反斜杠版本。
在下面的示例中,我们在Nginx日志错误文件中搜索单词fatal
,error
和critical
的的匹配行:
grep 'fatal\|error\|critical' /var/log/nginx/error.log
如果使用扩展的正则表达式选项-E
(或--extended-regexp
),则不应对运算符|
进行转义,如下所示:
grep -E 'fatal|error|critical' /var/log/nginx/error.log
静默模式
-q
(或--quiet
)告诉grep
不要向终端写入任何内容(标准输出)。如果找到匹配项,该命令将以状态0
退出。在要检查文件是否包含指定字符串并根据结果执行某些操作的shell脚本中使用grep
时,这会很有用。
这里是在if
语句中使用静默模式下的grep
作为测试命令的示例:
if grep -q PATTERN filenamethen
echo pattern found
else
echo pattern not found
fi
基本正则表达式
GNU Grep具有两个正则表达式功能集,即Basic基本和Extended扩展。默认情况下,grep
将模式解释为基本正则表达式。
使用^
符号来匹配在行首。在下面的示例中,字符串kangaroo
仅在出现在行的开头时才匹配。
grep "^kangaroo" file.txt
使用$
符号以匹配行尾。在下面的示例中,仅当字符串kangaroo$
出现在一行的最后时才匹配。
grep "kangaroo$" file.txt
使用.
符号以匹配任何单个字符。例如,要匹配以kan
开头,具有两个字符并以字符串roo
结尾的任何内容,可以使用以下模式:
grep "kan..roo" file.txt
使用[ ]
中括号中匹配指定范围的字符。例如,找到包含accept
或“ accent
”的行,可以使用以下模式:
grep "acce[np]t" file.txt
使用[^ ]
以匹配非括号内的任何字符。以下模式将匹配包含co(any_letter_except_l)a
的字符串的任何组合,例如coca
,cobalt
等,但不匹配包含cola
的行
grep "co[^l]a" file.txt
要转义字符的特殊含义,请使用\
(反斜杠)符号。
扩展的正则表达式
要将模式解释为扩展的正则表达式,请使用-E
(或--extended-regexp
)选项。扩展的正则表达式包括所有基本元字符,以及用于创建更复杂和更强大的搜索模式的其他元字符。以下是一些示例:
从指定的文件中提取所有电子邮件地址:
grep -E -o "\b[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt
在指定的文件中匹配提取所有IP地址:
grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' file.txt
-o
选项用于仅打印匹配的字符串。
打印匹配行的前段部分
要在匹配的行之前打印指定数量的行,请使用-B
(或--before-context
)选项。
例如,要在匹配的行之前打印前五行,可以使用以下命令:
grep -B 5 root /etc/passwd
打印匹配行的后段部分
要在匹配的行之后打印指定数量的行,请使用-A
(或--after-context
)选项。
例如,要在匹配的行之后显示尾随五行,可以使用以下命令:
grep -A 5 root /etc/passwd
结论
grep
命令允许您在文件内部使用搜索模式。如果找到匹配项,则grep将打印包含指定模式的行。请访问Grep用户手册页面,了解有关Grep的更多信息。如果您有任何问题或反馈,请随时发表评论。
以上是 在Linux中使用Grep命令在文件中搜索文件内容 的全部内容, 来源链接: utcz.com/z/507452.html