吾日三省吾身,想出类拔萃,要把知识学牢,学全,学深,学广。
特殊符号
? 表示任意单个字符
ll ?.txt
统计文件字符长度
cat 1.txt|wc -L
只会显示文件中最长一段的字符长度
单引号双引号不加引号的区别 与变量有关
echo $name echo "$name" 输出变量
echo '$name' 输出$name字符
单引号所见即所得,不会解析变量
基础正则表达式
正则表达式 简单 高效 易用
三剑客用的都是正则
普通命令用的都是通配符
通配符找文件名称
正则表达式找文件内容
基本正则表达式无法满足需求,就出现了扩展正则表达式
^ $ . [ ] *
( ) {} ? + | 等等
^ #以什么什么开头的行
[root@VMware-koten ~]#grep '^m' test.txt
$ #以什么什么结尾的
[root@VMware-koten ~]#grep '!$' test.txt
cat -A test.txt 在每行的结尾加$符号
空格 #可以过滤空格
[root@VMware-koten ~]#grep ' ' test.txt
$ 后面跟变量 用双引号就匹配变量,用单引号就是原文本
^$ 表示空行
grep -n 显示过滤前内容所在的行号
grep -v 取反,匹配出来之后,显示除了这个之外的其他的内容
. 表示除换行符外其他所有单个字符
.. 每次匹配两个字符
-o 每一个字符都会按列输出
.$ 每一行末尾都能匹配上,空格也能匹配上
\.$ 以.结尾
\ 转义字符
\n 换行符
\t tab键
* 前一个字符出现0及0次以上,如果没有,则显示所有内容
匹配到了再-o,会把匹配的部分,匹配的一个部分显示一行
.* 所有字符,并且-o后每一个部分显示一行
[0-9a-zA-Z:,.] 匹配区间,中括号也有脱马甲的意思,所以说.前面不用加撬棍
基础正则小结
^ 以什么开头的行
$ 以什么结尾的行
. 任意单个字符
.* 任意所有字符
^$ 表示空行
[abc] 表示任意单个字符,中括号中还原本意
[^abc] 除了abc其他的字符,都匹配,^在中括号中取反
^[abc] 查找要么a要么b要么c开头的
[^^abc] 第一个是取反,第二个是还原本意,普通字符
[0-9] 区间也支持
[a-z] 区间也支持
[0-9a-zA-Z] 区间也支持
[a-Z] 区间也支持
扩展正则表达式
(){}?+|
grep -E 支持扩展正则
egrep 支持扩展正则
+ 前一个字符出现1次及1次以上 跟*的区别是出现0次不会所有内容都出现
| 或者,可以同时过滤多个条件
1{n,m} 前一个数字1最少出现n次,最多出现m次,可能出现部分比m次数多,但是-o会发现一行最多m次
1{m} 前一个数字1最多出现m次
() 一个整体,配合+使用,如果是一个整体-o,出现部分如何连续,会连贯出现。
如果只是一个字符出现1次或1次以上,会一个一列出现
企业常用正则表达式
1.过滤以什么开头 ^ ^#
2.^$ 空行
3.[]
4.[]+ awk结合
5.sed后向引用()
常用通配符
1.*.txt
2.[1-9].txt
3.{}
正则使用案例分享
1、将ip add中的ip筛选出来。
2、我们看到IP所在行是eth0结尾的,将IP所在行筛选出来
ip add|grep 'eth0$'
3、我们知道IP是由0-9数字和点组成,我们通过这个方式筛选。设置中括号里面字符最多出现10次。
ip add|grep 'eth0$'|egrep [0-9.]{10}
4、当然IP数字和点出现次数不一定每次都是10,如果找通用方法,我们需要用拼接的方式。
ip add|grep 'eth0$'|egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
5、匹配到该行IP就好说了,咱们直接grep -o,然后head -1即可。
ip add|grep 'eth0$'|egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' -o |head -n1
大功告成!
我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!