shell编程四剑客之 grep

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值