三剑客详解
一、grep基本使用
语法结构:模糊过滤查找内容
grep '查找的内容' file
cat file | grep '查找屏幕上输出的内容'
参考选项:
r:递归过滤文件的内容
v:取反
w:过滤单词,以空格分割,精确匹配
i:不区分大小写
n:过滤到内容的具体行号
c:统计单词次数
o:查看匹配过程
E:支持扩展正则
A:显示查找内容的下N行
B:显示查找内容的上N行
C:显示查找到内容上下各N行
二、sed
作用:替换
- 内容查找替换
- 增加内容
- 替换内容
- 删除内容
- 格式化输出,反向引用
语法结构:
1、基础常用:
grep '找谁' file
sed -n '/找谁/动作' file # 模糊过滤,默认输出所有内容 -n:只打印查找到内容;默认输出全部
动作:p--输出查找到的内容;d--删除查找到内容的行
sed -n 'np' file # 打印输出第n行的数据
sed 选项参数:-n 取消默认输出
sed 's#替换谁#替换成谁#g' 替换
2、模糊过滤:
sed -n '/过滤到内容/p' file
sed -n '/开始/,/结束/p' file
参数选项:-r--->支持扩展正则
3、sed删除
sed '3d' file
sed '//d' file
4、sed增加内容
sed '3a 内容' file 在第3行的下面插入内容
sed '3i 内容' file 在第3行处插入内容
sed '3c 内容' file 替换整行内容 (写shell使用系统优化)
sed '3w 1.txt' file 将第3行的内容保存到文件中
sed -i '3c 内容' file 将会直接执行(因为有i)
5、sed反向引用
sed 's#()#\1#g' file
案例:
【数据准备】
[root@web01 ~]# head -5 /etc/passwd > test.txt
[root@web01 ~]# cat test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
1、按照行查找内容
[root@web01 ~]# sed -n '3p' test.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin
2、输出文件的2-4行
[root@web01 ~]# sed -n '2,4p' test.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
3、输出文件的最后一行
[root@web01 ~]# sed -n '$p' test.txt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
4、输出文件的3~最后一行
[root@web01 ~]# sed -n '3,$p' test.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
5、处理其他命令的输出
[root@web01 ~]# cat test.txt | sed -n '3p'
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@web01 ~]# ifconfig eth0|sed -n '2p'
inet 10.0.0.7 netmask 255.255.255.0 broadcast 10.0.0.255
6、删除源文件的内容
[root@web01 ~]# sed -i '2,4d' test.txt
[root@web01 ~]# cat test.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7:sed '3c 内容' file # 替换整行内容(写shell使用系统优化)
[root@web01 ~]# sed '3c hehe' 1.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
hehe
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
8、支持正则,[:/]:表示:或者/或者:/
[root@web01 ~]# sed 's#[:/]# #g' test.txt
root x 0 0 root root bin bash
bin x 1 1 bin bin sbin nologin
daemon x 2 2 daemon sbin sbin nologin
root x 0 0 root root bin bash
adm x 3 4 adm var adm sbin nologin
lp x 4 7 lp var spool lpd sbin nologin
9、反向代理
[root@web01 ~]# ifconfig eth0|sed -n '2p'|sed -r 's#^.*inet (10.0.0.200) net.*s#\1#g'
inet 10.0.0.200 netmask 255.255.255.0 broadcast 10.0.0.255
[root@web01 ~]# ifconfig eth0|sed -n '2p'|sed -r 's#^.*inet (10.0.0.200) net.*$#\1#g'
10.0.0.200
常用方式:
# 过滤区间范围进行统计,过滤时间日志进行切割
# 需求:统计最近2小时的日志或者过滤昨天一天的日志
1)日志切割
mv access.log 2023-10-10-access.log
mv access.log 2020-10-11-access.log
2)取区间范围统计
[root@oldboy ~]# sed -n '/2023:03:25:14/,/2023:04L00L10/p' access.log
知识点小结:
sed参数选项:
-i 修改源文件
-r 支持扩展正则
-n 取消默认输出
1.指定行
sed -n '3p' file
sed -n '3,5p' file 区间
2.模糊过滤
sed -n '//p' file
sed -n '//,//p' file
3.sed删除
sed '3d' file
sed '2,5d' file
sed '//,//d' file
4.sed增加
sed '3c 内容' file
sed '3a' '3i' '3w'
5.sed替换 支持正则 []
sed 's###g' file
sed 's@@@g' file
模式+动作
sed '2s###g' file # 只替换第2行的内容
6.后向引用想要谁就把谁保护起来()
sed -r 's#()()()#\2#g'
使用sed的动作分隔获取不连续的行
sed -n '2p;4p' test.txt
三、awk基本使用
作用:
- 取行
- 取列
- 运算
- 支持判断,循环,数组,shell编程
- 格式化输出,配合sort、uniq、head使用
语法结构:
awk '找谁' file
查找指定的行:awk 'NR==3' file
模糊查找:awk '/查找内容/' file
区间:awk '//,//' file
比较表达式:awk '$1=="root"' file
awk '{print $1}' file
awk '找谁{print $1}' file
awk的内置变量
1)NR 存储着每行的行号
NR==3
NR!=3
NR>3
NR>=3
NR<3
NR<=3
并且:&&
或者:||
2)$0存储着每行的内容 三剑客处理数据都是按行处理
3),逗号 存储着空格
4)NF 存着最后一列的列号
注意:在awk的动作中所有的字符串都视作变量
awk运算:
BEGIN:读取文件之前做的动作
END:读取完文件之后做的动作
案例:
【准备环境】
[root@web01 ~]# cat test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
# 1、查看第三行
[root@web01 ~]# awk 'NR==3' test.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin
# 2、以冒号分割出最后一列
[root@web01 ~]# awk -F ":" '{print $7}' test.txt
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
# 查看文件
[root@web01 ~]# cat 3.txt
root:x:0:0:root:/root:/bin/bash
熊大 100 zs 20
# BEGIN和END都是读取文件之前或者之后的动作都对文件不会有影响,但是{print "ok"}就不一样了,这属于有几行执行几次
[root@oldboy ~]# awk 'BEGIN{print "开始"}{print "ok"}END{print "error"}' 3.txt
开始
ok
ok
error
[root@oldboy ~]# awk 'BEGIN{print "OK"}'
OK
[root@oldboy ~]# awk 'BEGIN{print 10+10}'
20
本文作者:Dusk_Yun
本文链接:https://www.cnblogs.com/9Dusk/p/18365137
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步