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转成以空格隔开的一行