grep的全称是global search regular expression,grep,全面搜索正则表达式,是一种强大的文件搜索工具,它能使用正则表达式以行为单位搜索文本并把匹配的行打印出来,grep 的家族包括grep、egrep、fgrep,后两者是grep的升级版,但是官网已经弃用了 egrep、fgrep,官方推荐使用egrep 等介于 ‘grep -E’,使用fgrep等于 ‘grep -F’,本文主要讲解grep的使用,其语法格式如下:
grep [选项] "key_word" 文件名
说明:key_word是要匹配的关键字字符,建议要用双引号或单引号括起来,特别是一些特殊字符的时候,不然特殊字符会转译的。
常用参数选项如下:
-a :以文本文件方式搜索
-NUM :表示输出匹配行的同时也输出显示匹配行的上下num行
-C, --context=NUM :同-NUM,表示输出匹配行的同时也输出显示匹配行的上下num行
-B, --before-context=NUM :表示输出匹配行的同时也输出显示匹配行的下num行
-A, --after-context=NUM :表示输出匹配行的同时也输出显示匹配行的上num行
-v :反向选择,即显示不包括匹配关键字的所有行,即过滤掉指定关键词的行(非常常用)
-c :统计找到符合关键字所在行的总次数,注意不是关键字的个数哦
-i :忽略关键字的大小写(非常常用)
-n :输出显示关键字所在的行号(非常常用)
-h :查询多文件时不显示文件名
-l :查询多文件时只输出包含匹配字符的文件名
-s :不显示不存在或无匹配文本的错误信息
-E :允许使用egrep扩展模块匹配,即将样式为延伸的正则表达式来使用(非常常用)
| :竖杠,与-E参数配合使用,表示同时匹配多个关键字,关键字直接使用竖杠间隔(非常常用)
-o :仅显示匹配的关键字,默认情况下grep 会显示匹配的行,-o则可以仅显示匹配的关键字
通配符类型解析
*号 :表示匹配0到多个字符(非常常用)
?号 :表示匹配一个字符
#号 :注释符号
|号 :管道符号(非常常用)
;号 :冒号多条命令连续执行
&号 :后台运行指令
!号 :逻辑非
[ ]号 :内容范围,匹配中括号中的内容
{ }号 :命令块,多个命令匹配
正则表达式详解
^ :匹配行首,即以某个字符开头(非常常用),^与$结合起来就表示空行,即^$表示空行
$ :匹配行尾,即以某个字符结尾(非常常用),^与$结合起来就表示空行,即^$表示空行
* :星号,匹配前一个字符0次或多次(非常常用)
. :点号,匹配除换行符外任意一个字符
.* :点星,代表任意字符
\(..\) :标记匹配字符
[ ] :匹配中括号中的任意指定字符,但只匹配一次
[^ ] :匹配非中括号中指定字符
\ :转译字符,取消特殊含义
\< :锚定单词的开始
\> :锚定单词的结束
{n} :匹配字符出现n次
{n,} :匹配字符出现大于等于n次
{n,m} :匹配字符至少出现n次,至多出现m次
\w :匹配文字和数字字符
\W :\w的反置形式,匹配一个或多个非单词字符
\b :单词锁定字符
\s :匹配任何空白字符
\d :匹配一个数字字符,等价于[0-9]
演示示例:
[root@Centos8 ~]# grep nfsnobody /etc/passwd #正常输出,只匹配到一行
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@master ~]# grep nfsnobody -2 /etc/passwd #表示输出匹配行同时也输出显示匹配行的上下2行
oracle:x:1000:1000::/home/oracle:/bin/bash
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin #匹配行
saslauth:x:998:76:Saslauthd user:/run/saslauthd:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
[root@master ~]# grep nfsnobody -B2 /etc/passwd #表示输出匹配行同时也输出显示匹配行的上2行
oracle:x:1000:1000::/home/oracle:/bin/bash
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@master ~]# grep nfsnobody -A2 /etc/passwd #表示输出匹配行同时也输出显示匹配行的下2行
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
saslauth:x:998:76:Saslauthd user:/run/saslauthd:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
[root@Centos8 ~]# grep nginx /etx/passwd #查看nginx用户是否存在
[root@Centos8 ~]# ps -ef | grep "nginx" | grep -v "grep" #配合管道符查看nginx进程是否存在,同时过滤grep默认的grep输出行
[root@Centos8 ~]# grep -v "#" /usr/local/nginx/conf/nginx.conf #-v,反向选择,非的含义,即选择打印输出没有#号的行
[root@Centos8 ~]# grep -c "http" /usr/local/nginx/conf/nginx.conf #输出5,-c表示行数,即表示http一共出现在了5行,不是5次哦
[root@Centos8 ~]# grep -i "http" /usr/local/nginx/conf/nginx.conf #-i表示匹配关键字时忽略大小写
[root@Centos8 ~]# grep -n "http" /usr/local/nginx/conf/nginx.conf #-n表示打印关键字http所在行号并输出显示
[root@Centos8 ~]# grep "test[53]" test.txt #表示搜索test开头,后面是5或3的行
[root@Centos8 ~]# grep ^"#" /usr/local/nginx/conf/nginx.conf #匹配以#号为开头的第一个字符的行,如果第一个字符是空格,第二个字符才是#,这样也是不匹配的
[root@Centos8 ~]# grep -n "^$" /usr/local/nginx/conf/nginx.conf # "^$"就表示了空白行,查找空白行并显示行号
grep -E "\<([0-9]{1,3}\.){3}([0-9]{1,3})\>" /usr/local/nginx/conf/nginx.conf #查找匹配IPv4地址
find /var/log/ -type f -name *.log |xargs grep -i "error" #查找/var/log/下所有日志文件中包含有error的行
[root@Centos8 ~]# grep -E "apache|file" file #查找文件内容,只要匹配 apache字符串或file字符串的都算匹配成功
[root@Centos8 ~]# grep -Ev "^$|^#" /etc/nginx/nginx.conf #输出过滤掉nginx.conf文件注释掉的行和空行(很实用)
小结
下面几个是非常实用的例子:
^表示以什么什么开头,使用方式为 '^#',表示以#号开头,如下例子:
grep '^#' /etc/nginx/nginx.conf #输出以#号开头的行,即输出注释行
grep -v '^#' /etc/nginx/nginx.conf #输出不是以#号开头的行,即输出非注释行
$表示以什么什么结尾,使用方式为 'nologin$',表示以nologin结尾,如下例子:
grep 'nologin$' passwd
匹配空行则这样表示:
grep "^$" /usr/local/nginx/conf/nginx.conf # "^$"就表示了空白行
grep -v "^$" /usr/local/nginx/conf/nginx.conf # "^$"就表示了空白行,-v则是过滤掉空行
同时过滤掉注释行和空白行:
grep -Ev "^#|^$" /etc/nginx/nginx.conf