基础正则grep、sed、awk
先创建一个文件
[root@zheng ~]# cat -n /zyf/jianli.txt
1 I am student!
2 I like Liunx.
3
4 I like basketball
5 I like badminton ball ,billiard ball and chinese chess!
6 my blog is http://oldboy.blog.51cto.com
7 our size is http://blog.oldoyedu.com
8 my WeChat is 13522828457
9
10 not 490000448.
11 my god ,i an not oldbey,but OlDEBOY!
" ^ "查找开头为…的行
查找以m开头的行
[root@zheng ~]# grep -n "^m" /zyf/jianli.txt
6:my blog is http://oldboy.blog.51cto.com
8:my WeChat is 13522828457
11:my god ,i an not oldbey,but OlDEBOY!
" $ " 查找结尾为…的行
查找以m结尾的行
[root@zheng ~]# grep -n "m$" /zyf/jianli.txt
6:my blog is http://oldboy.blog.51cto.com
7:our size is http://blog.oldoyedu.com
这里补充一下
如果有但是搜索不到话有可能是m后面多了一个空格,在复制粘贴的时候经常出现
可以用cat -A查看
带 $ 的就是空或者回车
[root@zheng ~]# cat -A /zyf/jianli.txt
I am student!$
I like Liunx.$
$
I like basketball$
I like badminton ball ,billiard ball and chinese chess!$
my blog is http://oldboy.blog.51cto.com$
our size is http://blog.oldoyedu.com$
my WeChat is 13522828457$
$
not 490000448.$
my god ,i an not oldbey,but OlDEBOY!$
" ^$ " 显示空行
显示空行
[root@zheng ~]# grep -n "^$" /zyf/jianli.txt
3:
9:
加-v参数,反选,除了空行全显示
[root@zheng ~]# grep -nv "^$" /zyf/jianli.txt
1:I am student!
2:I like Liunx.
4:I like basketball
5:I like badminton ball ,billiard ball and chinese chess!
6:my blog is http://oldboy.blog.51cto.com
7:our size is http://blog.oldoyedu.com
8:my WeChat is 13522828457
10:not 490000448.
11:my god ,i an not oldbey,but OlDEBOY!
" * " 前一个字符连续出现0次或0次以上
前一个字符连续出现0次或0次以上
显示blog出现的次数
加上-o显示次数
[root@zheng ~]# grep "blog*" /zyf/jianli.txt
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldoyedu.com
[root@zheng ~]# grep "blog*" /zyf/jianli.txt -o
blog
blog
blog
" . " 匹配任意字符,不匹配空行
匹配任意字符,不匹配空行
-o 一个字符一个字符显示
[root@zheng ~]# grep -no "." /zyf/jianli.txt
1:I
1:
1:a
1:m
1:
1:s
1:t
1:u
1:d
1:e
1:n
1:t
1:!
2:I
2:
2:l
2:i
2:k
2:e
2:
2:L
2:i
2:u
2:n
2:x
2:.
4:I
4:
4:l
4:i
....
.....后面的就不粘贴了
" .* " 所有符号,任何连续出现的字符
所有的任何符号,包含空行、多个空格
贪婪性
.*所有符号,任何符号,连续出现的符号,有多少匹配多少
显示从开头到结尾为o的行
所以这里会显示到第一个o还没有结束后,一直到最后一个o才结束
[root@zheng ~]# grep -n "^.*o" /zyf/jianli.txt
5:I like badminton ball ,billiard ball and chinese chess!
6:my blog is http://oldboy.blog.51cto.com
7:our size is http://blog.oldoyedu.com
10:not 490000448.
11:my god ,i an not oldbey,but OlDEBOY!
显示从开头到p结束的行
[root@zheng ~]# grep -n "^.*p" /zyf/jianli.txt
6:my blog is http://oldboy.blog.51cto.com
7:our size is http://blog.oldoyedu.com
" \ "
撬棍 转义字符
撬棍,转义字符,如果要是查询符号的话可能会与命令的参数冲突,这个时候加上 \ 就可以了
可以搜一下点
前面有提到过点事所有字符,所以光搜点的话需要加上 \ 转义一下
[root@zheng ~]# grep -n "\." /zyf/jianli.txt
2:I like Liunx.
6:my blog is http://oldboy.blog.51cto.com
7:our size is http://blog.oldoyedu.com
10:not 490000448.
# 查询以点结尾的行
[root@zheng ~]# grep -n "\.$" /zyf/jianli.txt
2:I like Liunx.
10:not 490000448.
转义字符系列
\n 回车换行
\t 按一次tab 8个空格长度
tr 把文件中所有回车替换成 tab
[root@zheng ~]# tr '\n' '\t' </zyf/jianli.txt
I am student! I like Liunx. I like basketball I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our size is http://blog.oldoyedu.com my WeChat is 13522828457 not 490000448.my god ,i an not oldbey,but OlDEBOY! [root@zheng ~]#
’ [ ] ’ 匹配多个字符
匹配小写a到小写z的行
在单引号的中括号里,里面的字符就没有特殊含义了不用再添加撬棍来转义
还有[A-Z]
[0-9]
也可以这么写
[a-zA-Z0-9]
如果不想搜索这么多也可以缩小范围
[1-5]这种也可以
[root@zheng ~]# grep '[a-z]' /zyf/jianli.txt
I am student!
I like Liunx.
I like basketball
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldoyedu.com
my WeChat is 13522828457
not 490000448.
my god ,i an not oldbey,but OlDEBOY!
查找开头为…和结尾为…的行
这里 ^和$ 都是放在中括号外头的
先匹配开头为o或者m的行
然后通过管道命令再匹配结尾为m的行
[root@zheng ~]# grep -n '^[om]' /zyf/jianli.txt |grep '[m.]$'
6:my blog is http://oldboy.blog.51cto.com
7:our size is http://blog.oldoyedu.com
排除输入的字符
排除掉文件全部的小写字母
只显示符号,大写字母,数字
[root@zheng ~]# grep -n '[^a-z]' /zyf/jianli.txt
1:I am student!
2:I like Liunx.
4:I like basketball
5:I like badminton ball ,billiard ball and chinese chess!
6:my blog is http://oldboy.blog.51cto.com
7:our size is http://blog.oldoyedu.com
8:my WeChat is 13522828457
10:not 490000448.
11:my god ,i an not oldbey,but OlDEBOY!
扩展正则 egrep、grep -E 、 sed -r 、 awk
‘[ ]’ 正则表达式中,里面的特殊符号 . * | 没有特殊含义
+ 显示一个字符出现多次的行
[root@zheng ~]# egrep -n '2+' /zyf/jianli.txt
8:my WeChat is 13522828457
也可以’[a-Z]’
只可以在egrep/grep中使用,其他的三剑客没法用
[root@zheng ~]# egrep -n '[a-Z]+' /zyf/jianli.txt
1:I am student!
2:I like Liunx.
4:I like basketball
5:I like badminton ball ,billiard ball and chinese chess!
6:my blog is http://oldboy.blog.51cto.com
7:our size is http://blog.oldoyedu.com
8:my WeChat is 13522828457
10:not 490000448.
11:my god ,i an not oldbey,but OlDEBOY!
删除空行或者只有空格的行
少了第一行和第四行
[root@zheng ~]# sed -r '/^$|^ +$/d' kong |cat -An
1 a $
2 a$
3 s$
4 s $
5 s$
让选中的行以单词的形式排列
在最后加一个-o参数
[root@zheng ~]# egrep -n '[a-Z]+' /zyf/jianli.txt -o
1:I
1:am
1:student
2:I
2:like
2:Liunx
4:I
4:like
4:basketball
5:I
5:like
5:badminton
5:ball
5:billiard
5:ball
5:and
................
| 或者
显示blog和my的行
[root@zheng ~]# egrep -n 'blog|my' /zyf/jianli.txt
6:my blog is http://oldboy.blog.51cto.com
7:our size is http://blog.oldoyedu.com
8:my WeChat is 13522828457
11:my god ,i an not oldbey,but OlDEBOY!
排除#和空行
-v 反选
‘#|^$’ #和空行
[root@zheng ~]# egrep -vn '#|^$' /zyf/jianli.txt
1:I am student!
2:I like Liunx.
4:I like basketball
5:I like badminton ball ,billiard ball and chinese chess!
6:my blog is http://oldboy.blog.51cto.com
7:our size is http://blog.oldoyedu.com
8:my WeChat is 13522828457
10:not 490000448.
11:my god ,i an not oldbey,but OlDEBOY!
( ) 表示一个整体 反向引用/后向引用(sed)grep和egrep很少用
这句话如果写全的话是 ‘oldboy|oldbey’
但是这样很麻烦,因为前面的都一样,所以就可以用在后面用小括号括起来
[root@zheng ~]# egrep -n 'oldb(oy|ey)' /zyf/jianli.txt
6:my blog is http://oldboy.blog.51cto.com
11:my god ,i an not oldbey,but OlDEBOY!
sed小括号使用,在字符边添加内容
先输出12345
通过管道命令传到sed来替换 s#原本内容#要替换的内容#g
用.*代表所有字符,把他用小括号保护起来
后面的 \1 代表第一个小括号内容,可以在两边加上符号什么的
sed 要加-r参数
-r, --regexp-extended
use extended regular expressions in the script.
-r、 --regexp扩展
在脚本中使用扩展正则表达式。
这样可以通过sed命令添加括号或者别的符号
[root@zheng ~]# echo '12345'
12345
[root@zheng ~]# echo 12345 | sed 's#(.*)#<\1>#g'
sed: -e expression #1, char 13: invalid reference \1 on `s' command's RHS
[root@zheng ~]# echo 12345 | sed -r 's#(.*)#<\1>#g'
<12345>
也可用用点来从原本字符的中间开始加
一个点代表一个字符
如果字符不一样的话会出错
像下面一样把34用尖括号括起来
然后再选第六个字符不加东西
撬棍加数字就代表是第几个括号里的内容
\4就是第四个括号,不过现在没有这么多,只做了两个
[root@zheng ~]# echo 123456 |sed -r 's#..(..)....#<\1>#g'
123456
[root@zheng ~]# echo 123456 |sed -r 's#..(..)..#<\1>#g'
<34>
[root@zheng ~]# echo 123456 |sed -r 's#..(..).(.)#<\1>\2#g'
<34>6
sed小括号使用,添加内容以后重定向到文件
[root@zheng ~]# echo 123456 |sed -r 's#..(..).(.)#<\1>\2#g' >sed.txt
[root@zheng ~]# nl sed.txt
1 <34>6
小括号的灵巧应用
[root@zheng ~]# echo '123456' |sed -r 's#(.)#<\1>#g'
<1><2><3><4><5><6>
[root@zheng ~]# echo '123456' |sed -r 's#([1-3])#<\1>#g'
<1><2><3>456
[root@zheng ~]# echo '123456' |sed -r 's#([1|5])#<\1>#g'
<1>234<5>6
{} 指定出现多少次 匹配正确的身份证号
[root@zheng ~]# vi test.txt
金 211324198415244720
万 500224197105168312
万 646461asd
任 123123123zyf
任 linux6543454345354
任 j516515615635433
任 50182197306dagasdd
吕 21128219920911303X
空 150000019321112611
控 255133215131525131
向 19264611813621162X
杜 11010151351332153x
[root@zheng ~]# egrep '[0-9]{18}|[0-9]{17}X' test.txt
金 211324198415244720
万 500224197105168312
吕 21128219920911303X
空 150000019321112611
控 255133215131525131
向 19264611813621162X
[root@zheng ~]# egrep '[0-9X]{18}' test.txt
金 211324198415244720
万 500224197105168312
吕 21128219920911303X
空 150000019321112611
控 255133215131525131
向 19264611813621162X
[root@zheng ~]# egrep '[0-9]{17}[0-9X]' test.txt
金 211324198415244720
万 500224197105168312
吕 21128219920911303X
空 150000019321112611
控 255133215131525131
向 19264611813621162X
ERE小结
1、+一般[]进行配合 把各种连续的东西取出来
2、 | 或
3、() 一个整体 ,后向引用 -sed
4、()0{n,m} 前一个字符至少连续出现了n次,最多连续出现了m次
5、?前一个字符连续出现0次或1次
sed命令把ip取出来
查询ip的两种方式
1、查询关键词 /inet /p
2、打印行数 3p
过滤inet发现有个inet6一起显示了,第一行后面有空格不是数字,所以加上一个空格就好了
[root@zheng ~]# ip add show ens33 |sed -n '/inet/p'
inet 192.168.100.10/24 brd 192.168.100.255 scope global ens33
inet6 fe80::299c:3370:1a37:a22d/64 scope link
[root@zheng ~]# ip add show ens33 |sed -n '/inet /p'
inet 192.168.100.10/24 brd 192.168.100.255 scope global ens33
显示第三行
[root@zheng ~]# ip add show ens33 |sed -n '3p'
inet 192.168.100.10/24 brd 192.168.100.255 scope global ens33
这里是挨个测试,最后一步才是正确答案
s#后面的 ^.*t
从开头所有字符一直到t,这里注意.的贪婪性,如果后面也有t的话会直接跳到最后一个匹配到的字符上去,可以加一个空格
后面的(.)就是你要显示的内容,直接让他全部显示
由于只显示ip,所以ip后面的/24不要了,就直接在括号后面写上/
然后后面写.*所有字符一直到结尾$
后面要替换成\1
就是显示第一个括号的内容
[root@zheng ~]# ip add show ens33 |sed -n '3p'|sed -r 's#^.*t (.*)/##g'
24 brd 192.168.100.255 scope global ens33
[root@zheng ~]# ip add show ens33 |sed -n '3p'|sed -r 's#^.*t (.*)/.*$##g'
[root@zheng ~]# ip add show ens33 |sed -n '3p'|sed -r 's#^.*t (.*)/.*$#\(1)#g'
(1)
[root@zheng ~]# ip add show ens33 |sed -n '3p'|sed -r 's#^.*t (.*)/.*$#\(\)#g'
()
[root@zheng ~]# ip add show ens33 |sed -n '3p'|sed -r 's#^.*t (.*)/.*$#\()#g'
()
[root@zheng ~]# ip add show ens33 |sed -n '3p'|sed -r 's#^.*t (.*)/.*$#\1()#g'
192.168.100.10()
[root@zheng ~]# ip add show ens33 |sed -n '3p'|sed -r 's#^.*t (.*)/.*$#\1#g'
192.168.100.10
连ip带掩码一起显示
[root@zheng ~]# ip add show ens33 |sed -n '3p'|sed -r 's#^.*t(.*)brd.*$#\1#g'
192.168.100.10/24
正则表达式总结
1、egrep/grep 简单了解,看看效果,结果
2、egrep/grep -o 参数看正则到底匹配了什么
3、多练,配合grep,egrep,sed -r,awk
基础正则和扩展正则的区别
BRE(基础正则)^ $ ^$ . * .* [ ] [^]
ERE(扩展正则)+ | () {} ?