三剑客

Linux三剑客

grep

-n:打印行号
-A:after 	打印过滤内容的后N行
-B:before	打印过滤内容的前N行
-C:center	打印过滤内容的前后N行
-E:支持扩展正则 
-v:取反
-o:只打印匹配到的内容
-w:精确匹配
-P:支持Perl正则
-i:忽略大小写
-r:递归检索文件中的内容
-R:递归检索文件中的内容,包括软链接文件
-i:只显示文件名
-h:只显示文件内容
-f:对比文件内容,内容少的文件在前面,内容多的文件在后面,取反可以看到不同的文件内容
-c:统计行数
-G:支持基础正则
-m:显示前N行


# 过滤内容
[root@m01 web]# grep -r 'www.zls.com' /root/web/
/root/web/css/style.css:www.zls.com
/root/web/js/main.js:www.zls.com
/root/web/index.html:www.zls.com

# 将不一样的内容过滤出来并替换
[root@m01 web]# grep -lr 'www.zls.com' /root/web/|xargs sed -i.zls 's#www.zls.com#www.baidu.com#g'

sed

在sed中,我们核心内容,主要分为四个部分:

当然我们还有一些进阶的内容:模式空间与保持空间

sed命令执行流程

举个例子

# 以下是zls.txt文件内容
1,zls,666
2,wls,777
3,cls,888
4,lls,999

执行 sed -n '3p' zls.txt命令后,sed都做了啥?

# 1.sed先是按行读取文件内容
# 2.每读取一行内容,都会进行一次判断,是不是你想要的行
# 3.如果不是,则判断是不是加了-n选项
# 4.如果加了-n,就读取下一行
# 5.如果没加-n,就会将所有内容输出到命令行(默认输出)
# 6.如果是,你想要的那一行(第三行)则判断执行的后续动作(p d s a i c)
# 7.动作处理完成后,输出指定的内容
# 8.即便是读取完了,内容也输出了,sed也会继续往后读,直到文件的最后一行

sed-查

sed命令选项 选项含义 sed命令动作 动作含义
-n 取消默认输出 p 打印
-r 支持扩展正则 d 删除
a 追加
i 插入
# p :打印,显示

# sed显示单行内容
[root@m01 ~]# sed '3p' zls.txt
1,zls,666
2,wls,777
3,cls,888
3,cls,888
4,lls,999

# sed取消默认输出
[root@m01 ~]# sed -n '3p' zls.txt
3,cls,888

# sed显示多行内容并取消默认输出
[root@m01 ~]# sed -n '1,3p' zls.txt
1,zls,666
2,wls,777
3,cls,888

# sed模糊查询
[root@m01 ~]# sed -n '/zls/p' zls.txt 
1,zls,666

# 包含
[root@m01 ~]# sed -nr '/zls|cls/p' zls.txt 
1,zls,666
3,cls,888

# 都显示
[root@m01 ~]# sed -nr '/zls|cls/p' zls.txt 
1,zls,666
3,cls,888

## sed实现 grep -A(打印后N行)
[root@m01 ~]# sed -n '/zls/,+2p' zls.txt
1,zls,666
2,wls,777
3,cls,888


[root@m01 ~]# grep 'zls' -A 2 zls.txt 
1,zls,666
2,wls,777
3,cls,888

# sed 隔指定行数读取一行
[root@m01 ~]# sed -n '1~2p' zls.txt 
1,zls,666
3,cls,888

sed-删-d

d:删除

# 删除指定行数,不修改原文件
[root@m01 ~]# sed  '2d' zls.txt

# 删除最后一行
[root@m01 ~]# sed  '$d' zls.txt 
1,zls,666
3,cls,888

# 包含zls的行到zls行都删掉
[root@m01 ~]# sed -n '/zls/,/cls/d' zls.txt 

sed-增-a

c:replace 替换整行内容
[root@m01 ~]# cat zls.txt 
1,zls,666
3,cls,888
4,lls,999
[root@m01 ~]# sed '2c2,huanglong,438' zls.txt 
1,zls,666
2,huanglong,438
4,lls,999

a: append 追加(一般都是在内容后面插入)
[root@m01 ~]# sed '$a5,huanglong,438' zls.txt (追加到最后一行,$最后一行)
1,zls,666
3,cls,888
4,lls,999
5,huanglong,438

# 在第二行的后面加
[root@m01 ~]# sed '2a5,huanglong,438' zls.txt 
1,zls,666
3,cls,888
5,huanglong,438
4,lls,999

i-插入(一般都是在内容前面插入)

# 在最后一行前面插入
[root@m01 ~]# sed '$i2,huanglong,438' zls.txt 
1,zls,666
3,cls,888
2,huanglong,438
4,lls,999

# 在第一行前面插入
[root@m01 ~]# sed '1i2,huanglong,438' zls.txt 
2,huanglong,438
1,zls,666
3,cls,888
4,lls,999

sed-改-s

s: 替换
g; 全局
s 啥都行 g
s ### g

# 基础用法
[root@zabbix01 ~]# sed 's#zls#ZLS#g' zls.txt
1,ZLS,666
2,wls,777
3,cls,888
4,lls,999

# 使用正则
[root@m01 ~]# sed 's#[0-9]#666#g' 1.txt 
zz 666666
xx 666666
qq 666666
ww 666666
ee 666666

# 后向引用
[root@m01 ~]# ifconfig eth0|sed -nr 's#^.*inet (.*)  net.*#\1#gp'
10.0.0.61
[root@m01 ~]# ip a s eth1|sed -nr 's#^.*inet (.*)/24.*#\1#gp'
172.16.1.61

sed的模式空间

将文件中的,所有换行符,替换成空格

# N:在读取文件是,让sed把下一行内容一起读进去 

posted @ 2022-07-29 16:13  Gabydawei  阅读(157)  评论(0编辑  收藏  举报