5.三剑客和正则表达式

三剑客和正则表达式

grep

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
             #擅长过滤
/var/log/secure/ 记录用户登陆系统的行为,登录成功还是失败,系统都会自动记录这次登录动作

grep 'Failed password' secure # 将secure文件中带有'Failed password'的语句筛选出来

grep 'Failed password' secure | grep -Po "(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)"
# 正则表达式,将语句中的IP地址筛选出来

grep 'Failed password' secure | grep -Po "(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)"|sort -n
#排列

grep 'Failed password' secure | grep -Po "(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)"|sort -n|uniq -c
#计数,将重复的IP地址计数


# grep 参数
-n 显示行号
[root@localhost ~]# grep -n 'tcp' test.txt
#vi test.txt +48,表示进入vi的时候,光标直接定位的48行起始位置。
-C 对结果计数
[root@localhost ~]# grep -C 'tcp' test.txt
14
-i 不区分大小写
[root@localhost ~]# grep -n 'tcp' test.txt -i
-V 反向搜索,取反
[root@localhost ~]# grep -n 'udp' test.txt -V#将不含有udp的行全部过滤出来
-W 精准匹配
[root@localhost ~]# grep -w 'tcp' test.txt
-o 显示匹配的结果,前面的第一个示例中我们用过-o参数
[root@localhost ~]# grep -o -n 'tcp' test.txt
-A1 同时打印搜索结果行的后一行,A是after的简写
[root@localhost ~]# grep -A2 'ftp' test.txt
[root@localhost ~]#grep -A 2 'ftp' test.txt
-B3 同时打印搜索结果行的前三行,B是before的简写
[root@localhost ~]# grep -B2 'ftp' test.txt
-C2 同时打印结果行的上下各两行
[root@localhost ~]#grep -C2 'ftp' test.txt
-E 扩展正则表达式
#正则我们下面会细讲,先简单了解一下。
[root@localhost ~]# grep -E '.tp' test.txt#,就是正则表达式,表示任意的一个字符
[root@localhost~]# grep -E 'ftp|ssh' test.txt # 查找ftp或者ssh,|是或者的意恩,可以用多个ftp|ssh|telnet..
-p 使用perl正则
# perl语言中设计的正则表达式写法规则,很强大,很多领域都支持perl正则的语法结构。
[root@localhost ~]# grep -P "\d+" test.txt # 匹配所有的数字
[root@localhost ~]# grep -P "\d{4,}" test.txt # 匹配4位的数字

sed

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#擅长取行和修改替换
用法:sed [-nri] [动作] 目标文件文件
选项与参数:
-n :使用安静(silent)模式。在一般sed 的用法中,所有来自STDIN的数据一般都会被列出到终端上。但如果加上-n参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-r:sed的动作支持的是延伸型正则表示法的语法。(默认是基础正则表示法语法)
-i:直接修改读取的文件内容,而不是输出到终端。

动作说明:[ni[,n2]]function
n1,n2一般表示为行号

function:
a :指定行后面插入一行
d :删除
i :指定行前面插入一行
p :打印,#一般和前面的-n参数一起用
S :替换 需要I忽略大小写,全局替换需要g

sed -i 's/#.*//g' 1.txt # 将1.txt中的所有以#为开头的数据删除,g表示全局
sed -i '/^$/d' 1.txt # 删除空行

awk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 擅长取列
1.取列
awk '{print $1}' test.txt # 取test。txt文件中的第一列
awk '{print $1,$NF}' test.txt #取第一列和做后一列(DF表示最后一列)
2.计算
awk '{print $1,$2*$3}' test.txt # 取test。txt文件中的第一列以及第二列乘第三列的积
awk '{print $1 的价格为 $2*$3}' test.txt # 中间数值之间可以加信息
3.根据行号来筛选数据
# a = 1表示变量值,让a=1
# a == 1,表示判断一下a的值是不是等于1,等于1那么条件判断结果为真,不等1那么条件判断结果为假

#支持符号: > < == >= <=
[root@localhost~]# awk 'NR==1' 4.txt #取出第一行数据,grep不会取出特定的行,只能筛选某些行
orange 10 20
[root@localhost~]# awk 'NR>2' 4.txt #取出行号大于2的行数据
mongo 50 10
banana 52 00
[rootaloca1host~]# awk 'NR<=3' 4.txt #取出行号小于等于3的行数据
orange 10 20
apple 20 30
mongo 50 10
[root@loca1host~]#awk 'NR<=3 && NR>1' 4.txt #取出行号大于1并且小于等于3的行
apple 20 30
mongo 50 10

#还可以取行的同时来取列
[root@localhost ~]# awk 'NR<=3{print $1}' 4.txt
orange
apple
mongo
4.指定分隔符,默认是按照空格作为分隔符的
awk -F ":" '{print $7,$1}' /etc/passwd # passwd文件是用 :作为分隔符的
5.过滤文本
awk -F ':' '$1~/h/' /etc/passwd # 找出passwd文件中第一列含有"h"的每一行的所有数据
awk -F ':' '$1~/h/{print $2,$3}' /etc/passwd # 找出passwd文件中第一列含有"h"的每一行的第二三列数据

正则表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
1.^表示搜索以什么开头。
grep '^#' test,txt # 找出test.txt中开头为#号的的行数据
grep -v '^#' test.txt # 找出开头不是#号的行数据
2.$ 表示搜索以什么结尾。
grep 'ol$' test.txt # 找出结尾为ol字母的行数据
3.^$ 表示空行,不是空格。
grep '^$' stest.txt # 找出所有的空白行
grep -v '^$' test.txt #找出所有的非空白行数据,如果保存一下,那么相当于快速则除所有空行。
# sed删除空行更容易,因为它更控长修改文件内容
sed -i '/^$/d' test.txt # 将原文件的空行全部删除。-i表示改变原文件
4. . 代表且只能代表任意一个字符,跟子斗地主中的子一样
grep '.dp' test.txt # 找出xdp,x可以是任意一个字符,注意,是一个!
5. \ 转义字符,让有着特殊身份意义的字符,脱掉马甲,还原原型。
例如:\.只表示小数点,还原原始小数点的意义。
grep '\.ia' test.txt # 这就表示,找到含有.dp的行数据
6. * 重复0个或多个前面的一个字符,不代表所有
grep '12*' num.txt # 结果会显示1 12 12222,会显示*前一个的字符的重复了0次或无数次的行数据
7.[abc] 匹配字符集合内任意一个字符[a-z]、[0-9]、[A-z],多选一,[0,9]这个是2选1.
grep -E '[o-9]' serv # 筛选出带有0-9的数据
grep -E '[0,9]' serv #筛选出带有0或者9的数据
8.[^abc] ^ 在中括号里面表示非,不包含a或b或c。
grep -E '[^0-9]*' serv # 不要数字
grep -E '[^a-z]' serv # 不要小写字母
grep -E '[^a-z0-9A-z]' serv # 不要字母和数字
9.{n,m} 重复n到m次,前一个字符。
#匹配一下ip地址:0.0.0.0 -- 255.255.255.255,这是ip地址的范围,个数上就是7-15个
grep -Eo '[0-9.]{7,15}' /var/log/secure # 但是如果有个大于7位的数字,也会被匹配上
#即文件中满足0-9这一条件7-15次的数据
grep -Eo '[0-9.]{7,15}' /var/log/secure|grep '\.'
10.+ 重复1次到多次,和*不同
grep -E '19*' serv
grep -E '19+' serv
11.?重复0次到多次,和*号很像。
grep -Eo '[0-9]?' serv
12.\d 和 [0-9]是一样的,但是它属于perl正则,grep使用perl正则的时候需要用-P参数来指定