为了能到远方,|

Dusk_Yun

园龄:6个月粉丝:0关注:0

2024-08-17 23:13阅读: 7评论: 0推荐: 0

三剑客详解

一、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 中国大陆许可协议进行许可。

posted @   Dusk_Yun  阅读(7)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起