grep
是Linux系统中强大的文本检索工具,它可以使用正则表达式,搜索输入文本中匹配的记录,并输出。
grep
命令家族包含grep
、fgrep
、egrep
。fgrep
相当于grep -F
,egrep
相当于grep -E
。
grep
支持BRE
、ERE
、Perl
规范的正则表达式,默认使用BRE
。
grep [-options]
grep
的options
选项主要包含四大类:
-b
或--byte-offset
:在显示匹配的行之前,标识出该行第一个字符在该文件或输入流中的字节偏移量
例如,显示字符串3456
所在的行中第一个字符的字节偏移量(示例字符流为helloworld\n123456
):
[root@local ~]# echo -e "helloworld\n123456" | grep -b "3456"
11:123456
-c
或--count
:计算一共有多少符合正则表达式的记录。
例如下面的例子中可以显示当前主机有多少个TIME_WAIT
连接:
[root@local ~]# netstat -ano | grep -c "TIME_WAIT"
相当于在netstat -ano
输出的结果中,找出一共有多少个TIME_WAIT
关键字
-m<次数>
或--max-count=<次数>
:当匹配记录达到多少次后停止检索
[root@local ~]# echo -e "abc\nabc\nabc" | grep -m2 "abc"
abc
abc
-n
或--line-number
:在打印匹配行之前加上该行行号
例如下面命令可以显示文件.bash_profile
中export
所在单词的行号和行内容:
[root@local ~]# grep -n "export" .bash_profile
12:export PATH
-h
或 --no-filename
: 在显示符合样式的那一行之前,不标示该行所属的文件名称。
[root@local ~]# grep -drecurse -h "export"
export PATH
-H
或--with-filename
:与-h
相反,标识所属的文件名称:
[root@local ~]# grep -drecurse -h "export"
.bash_profile:export PATH
-o
或--only-matching
:只打印出匹配正则表达式的文本,不打印出所在的行
[root@izj6cid7b1uq3w3cmzmf7ez ~]# grep -o "export" .bash_profile
export
-q
或--quiet
或--slient
:不输出任何信息
-d <动作>
或--directories=<动作>
:当指定的路径是文件夹而非文件时,需要使用该参数。“动作”参数主要包含三种:read
、recurse
、skip
三种:
read
在扫描指定路径时,若包含子目录时会报错。recurse
在扫描指定路径时,若包含子目录时,会进入子目录递归检索文件,等同于-r
或--recursive
。skip
在扫描指定路径时,若包含子目录时,会跳过。使用案例:
[root@local ~]# grep -drecurse "export"
.bash_profile:export PATH
-l
或--file-with-matches
:只列出符合正则表达式的文件名,不显示具体的行
例如下面的命令可以找出当前目录下存在长度超过20个字母的单词的文件名(省略输出)
[root@local ~]# grep -l -e "\w\{20,\}" -drecurse
-L
或--files-without-match
:与-I
相反,列出不符合正则表达式
-a
或--text
:不忽略二进制(非文本)数据
--include=<正则表达式>
:只检索文件名或文件夹名匹配指定正则表达式的文件
--exclude=<正则表达式>
:不检索文件名或文件夹名匹配指定正则表达式的文件
--exclude-dir=<正则表达式>
:不检索文件夹名匹配指定正则表达式的文件
--exclude-from=<正则表达式>
:不检索文件名匹配指定正则表达式的文件
--line-buffered
:每次搜索到匹配行后都会flush
一次输出缓冲区
-A<显示行数>
或--after-context=<显示行数>
:除了显示符合给定正则表达式的记录以外,还显示该行之后的内容。TIME_WAIT
连接的信息,找到匹配行后,如果我想要输出紧接着的后面一行,那么可以使用grep -A1
,如果不需要输出后面的一行,那么使用grep -A0
或忽略-A0
即可。[root@local ~]# netstat -ano | grep -A1 "TIME_WAIT"
tcp 0 0 172.17.38.237:43528 100.103.0.45:80 TIME_WAIT timewait (19.63/0/0)
tcp 0 0 172.17.38.237:59932 172.217.24.46:443 ESTABLISHED off (0.00/0/0)
--
tcp 0 0 172.17.38.237:35216 172.217.174.194:443 TIME_WAIT timewait (43.74/0/0)
tcp 0 0 172.17.38.237:51822 172.217.26.131:443 ESTABLISHED off (0.00/0/0)
[root@local ~]# netstat -ano | grep -A0 "TIME_WAIT"
tcp 0 0 172.17.38.237:43528 100.103.0.45:80 TIME_WAIT timewait (8.81/0/0)
--
tcp 0 0 172.17.38.237:35216 172.217.174.194:443 TIME_WAIT timewait (32.92/0/0)
-B<显示行数>
或--before-context=<显示行数>
:和-A
类似,只不过显示的是匹配行之前的行-C<显示行数>
或-<显示行数>
或--context=<显示行数>
:相当于-A
和-B
的结合,显示匹配行前后的行记录。-U
或--binary
,检索时不忽略\r
字符(Windows使用\r\n
作为换行符)-e<正则表达式>
或--regexp=<正则表达式>
:指定字符串作为查找文件内容的正则表达式。[root@local ~]# grep -e export .bash_profile
export PATH
当然也可以不使用-e
:[root@local ~]# grep export .bash_profile
export PATH
如果正则表达式包含空格,需要使用双引号。-i
或--ignore-case
:忽略大小写差别[root@local ~]# grep -drecurse -i "Export"
.bash_profile:export PATH
-w
或--word-regxp
:只匹配单词,也就是在读取文件时会以空格为分隔符将其拆分为多个单词,然后逐一比对[root@local~]# echo -e "hello world" | grep "hello w"
hello world
[root@local ~]# echo -e "hello world" | grep -w "hello w"
-x
或--line-regexp
:和-w
不同,-x
会以换行符\n
为分隔符,将文件拆分为多个部分,再逐一比对-f<规则文件路径>
或--file=<规则文件路径>
:指定一个规则文件,包含多个正则表达式,用换行符隔开。rule
,包含两个规则:hello
和world
,然后查找文本the world is my oyster
中,符合这两个规则的文本所在的行:[root@local ~]# echo -e "hello\nworld" > rule
[root@local ~]# echo "the world is my oyster" | grep -f rule
the world is my oyster
-F
或--fixed-strings
:将正则表达式视为固定字符串的列表-z
或--null-data
:每行以\0
结尾,而不是\n
-G
或--basic-regexp
:使用BRE
规范的正则表达式-E
或--extended-regexp
:使用ERE
规范的正则表达式-P
或--perl-regexp
:使用Perl
规范的正则表达式-s
或--no-messages
:不显示错误信息-v
或--revert-match
:显示不包含匹配文本所在的行[root@local ~]# echo -e "hello\nworld" | grep -v "hello"
world
-V
或--version
:显示grep
版本信息[root@local ~]# grep -V
grep (GNU grep) 2.20
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
--help
:查看帮助信息