Linux 正则表达式/三剑客之grep/find

2021/12/21 7:21:18

本文主要是介绍Linux 正则表达式/三剑客之grep/find,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

image

Linux三剑客之grep

grep 一般用来筛选数据,是文本过滤器。筛选我们需要的数据,如果某文件的内容符合指定的范本样式,

格式:grep [参数] [匹配规则] [操作对象]
参数:
	-n    显示匹配出的文本内容在原文件中的行号
	-o    只输出匹配内容
	-q    静默输出,一般是用在脚本中
	-->用echo$? 查看命令执行结果,返回0则执行成功,返回1执行失败
	-c    显示匹配到的行数
	-v    反向查找(显示不匹配的行,就是我们通常说的排除某些行,显示不包含匹配文本的所有行)
	- i     忽略大小写
	-R -r    使用递归过滤 
	-l    只输出匹配到文本的文件名(如果匹配成功,只打印文件名,失败则不打印)
	-L    只输出未匹配到文本的文件名
	-s    不显示不存在或无匹配文本的错误信息
	-E    使用扩展正则(下面会讲什么是正则规则)
	grep -E = egrep
	-A    显示匹配到的数据及后n行 -A 2 -->匹配到的数据及后面2行
	-B    显示匹配到的数据及前n行 -B 2 -->匹配到的数据及前面2行
	-C    显示匹配到的数据及前后n行 -C 2 -->匹配到的数据及前后2行
	wc:   匹配行数
		-l    打印匹配的行数
		-c    打印匹配的字节数

案例

1、要求过滤出/etc/passwd/中包含root的行及其行号
[root@judyju ~]# grep -n 'root' /etc/passwd

2、要求过滤出/etc/passwd/中包含root的行,只显示过滤到的内容
[root@judyju ~]# grep -o 'root' /etc/passwd 

3、要求过滤/etc/passwd/中包含Root的行,忽略大小写
[root@judyju ~]# grep -i 'Root' /etc/passwd 

4、要求匹配/etc/passwd/中mail所在的行以及前两行
[root@judyju ~]# grep -B 2 'mail' /etc/passwd 

5、要求显示包含mail的行有多少行
[root@judyju ~]# grep -c 'mail' /etc/passwd 

6、要求匹出在test.txt文件中包含judy的行
[root@judyju ~]# egrep '(judy)+' ./test.txt 

7、要求找出/etc目录下,哪些文件包含root
[root@judyju ~]# grep -R 'root' /etc
只显示文件的路径:[root@judyju ~]# grep -Rl 'root' /etc

8、计算/etc目录下包含root的文件有多少个
[root@judyju ~]# grep -c -R 'root' /etc | wc -l

9、过滤出当前主机包含的ip
[root@judyju ~]# ip a | grep -o -E '([0-9]{1,3}\.){3}([0-9]{3})'

正则表达式

正则表达式是通过包含特殊意义的一些字符去适配各种匹配场景,可以用来检查一个串是否含有某种子串。在linux中分普通正则表达式和扩展正则表达式

普通正则表达式

*    匹配前一个字符(连续出现)0次或1次以上,-->当重复0次的时候,表示啥也没有,即匹配所有内容
.    点号,表示匹配任意一个且只有一个字符(换行符除外)
.*   匹配所有内容
^    尖角号 以..开头
^.*    组合符 匹配任意字符开头的行
$    美元符 以..结尾
^$    表示空行
\    转义字符
.*$    以任意字符结尾
[]    中括号里的任意一个字符
[^]    取反
[a-z]    匹配[]内任意1个字母,即匹配任意一个小些字母
[A-Z]    匹配[]内任意1个字母,即匹配任意一个大写字母
[0-9]    匹配[]内任意1个数字
()    分组,组成一个整体,另外()的内通可以被后面的\n引用,n为数字表示第几个括号里的内容。
\n    表示第几个分组,引用前面()里的内容

案例

1、要求输出/etc/nginx/nginx.conf中不是以#开头的行
[root@judyju ~]# grep -v '^#' /etc/nginx/nginx.conf
                     # grep "^[^#]" /etc/nginx/nginx.conf
					 
2、要求输出1题文件中2后面有任意数量的任意字符的行
[root@judyju ~]# grep  '2.*' /etc/nginx/nginx.conf

扩展正则表达式

egrep 等价于 grep -E(前文已提及)
常见的扩展正则表达式特殊字符如下:

+    匹配前一个字符1次或1次以上
[:/]+    匹配括号内的:或/一次或一次以上
?    匹配前一个字符0次或者1次
|    管道符 表示或者,竖线两边是一个整体
{n}    匹配n次
{n,m}    匹配n到m次
{n,}    匹配n或更多次
{,n}    最多匹配n次

案例

1、匹配一个或多个2
[root@judyju ~]# egrep '2+' /etc/nginx/nginx.conf

2、匹配出2个4
[root@judyju ~]# egrep '4{2}' /etc/nginx/nginx.conf

3、匹配出包含2或者44的行
[root@judyju ~]# egrep '2|44' /etc/nginx/nginx.conf

4、要求将/etc/fstab中去掉包含#开头的行,且要求#后面至少有一个空格
[root@judyju ~]# egrep -v '^#\ +' /etc/fstab 

5、找出文件中至少有一个空格的行
[root@judyju ~]# egrep '\ +' /etc/fstab 

6、将nginx.conf文件中以#开头的行和空行,全部剔除
[root@judyju ~]# egrep -v '\ *^#|^$' /etc/fstab 

find命令

根据文件的名称或者属性查找文件
格式:find [查找范围] [参数]
参数:

-name    按照文件的名字查找文件
*    通配符
-iname    按照文件的名字查找文件(忽略大小写)
-size     按照文件的大小查询文件
	+  (加号) 大于 
	_  (减号) 小于
	没符号 等于
-mtime    按照修改时间去查询
	+   (加号)n天以前 
	_   (减号)n天以内
-mtime    按照修改时间查询
-atime    按照访问时间查询
-ctime    按照属性时间查询
-user    按照用户的属主查询
-group    按照用户的属组查询
-type    按照文件的类型查询
-perm    按照文件的权限查询
-inum    按照文件的index node号码查询
-a    并且
-o    或者
-maxdepth    查询的目录深度(必须放在所有参数的第一位)
-exec    将find处理好的结果交给其他命令继续处理

补充:

dd    生成文件
if    从......开始读
of    写入到.....文件
bs    每次写入多少内容
count    写入多少行
xargs    把处理的文本变成以空格分割的一行
``    反引号 提前执行命令,然后将结果交给其他命令来处理

案例

1、查询/etc目录下hosts文件
[root@judyju ~]# find /etc/ -name 'hosts'

2、查询/etc目录下名称中包含hosts文件
[root@judyju ~]# find /etc/ -name '*hosts*'

3、要求将/etc目录下,所有的普通文件打包压缩到/tmp目录下
[root@judyju ~]# tar czPf /tmp/etcv2.tar.gz `find /etc/ -type f | xargs`
	tar czPf -->打包压缩命令
	/tmp/etcv2.tar.gz 打包压缩好要放的路径
	find 后面的是以类型寻找并且通过xargs转成以空格隔开的一行


这篇关于Linux 正则表达式/三剑客之grep/find的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程