何为grep命令
grep
是Linux系统中强大的文本检索工具,它可以使用正则表达式,搜索输入文本中匹配的记录,并输出。
grep
命令家族包含grep
、fgrep
、egrep
。fgrep
相当于grep -F
,egrep
相当于grep -E
。
grep
支持BRE
、ERE
、Perl
规范的正则表达式,默认使用BRE
。
grep语法
grep [-options]
grep
的options
选项主要包含四大类:
- 输出控制
- 上下文控制
- 正则表达式类型的选择
- 其他杂项,比如输出版本信息
输出控制(Output Control)
-
-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
一次输出缓冲区
上下文控制(Context Control)
-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
作为换行符)
正则表达式控制(Regexp selection and interpretation)
-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
:查看帮助信息