目录
1.正则表达式
1.什么是正则表达式
由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符
主要用来匹配字符串(命令结果,文本内容)
通配符匹配文件(而且是已存在的文件)
基本正则表达式
扩展正则表达式
2.基本正则表达式分类
1.代表字符
2.表示次数
3.位置锚定
4.分组与其他
3.代表字符
.匹配任意单个字符,包括汉字
[]匹配指定范围内的任意单个字符
[^]匹配指定范围外的任意单个字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
\w #匹配单词构成部分,等价于[_[:alnum:]]
\W #匹配非单词构成部分,等价于[^_[:alnum:]]
\S #匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\s #匹配任何空白字符,包括空格、制表符、换页符等等,等价于 [ \f\n\r\t\v]。注意
Unicode 正则表达式会匹配全角空格符
元字符点(.)
ls /etc/|grep rc[.0-6]
ls /etc/|grep 'rc\.' #点需要加转义字符
grep r..t /etc/passwd #r..t ..代表任意两个字符
echo abc |grep a.c
echo abc |grep a\.c #
需要加引号和转义字符
grep [[:space:]] lc.txt
grep [[:space:]] lc.txt|cat -A #过滤空行并查看
4.表示次数
* #匹配前面的字符任意次,包括0次
.* #任意长度的任意字符,不包括0次
\? #匹配其前面的字符出现0次或1次,即:可有可无
\+ #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\} #匹配前面的字符n次
\{m,n\} #匹配前面的字符至少m次,至多n次
\{,n\} #匹配前面的字符至多n次,<=n
\{n,\} #匹配前面的字符至少n次
5.位置锚定
^ 代表开头
$ 代表结尾
\<和\b 代表字符串的开头,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)
\>和\b 代表字符串的结尾,用于单词模式的右侧
\<单词\> 匹配整个单词
grep "^[^#]" /etc/fstab #过滤出不是#号开头的行
grep "^google$" lc.txt #只过滤google
grep "^[[:space:]]*$" /etc/fstab #只匹配空白行
echo hello-123 |grep "\<123" #只匹配123
echo hello 123 |grep "\<123"
6.分组或其他
分组:使用( ) 将多个字符捆绑在一起,当作一个整体处理,如(root)+
后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名
方式为: \1, \2, \3, ...
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
\|:代表或者
7.扩展正则表达式
grep -E
1.表示次数
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次
{,n} #匹配前面的字符至多n次,<=n,n可以为0
{n,} #匹配前面的字符至少n次,<=n,n可以为0
2.表示分组
() 分组
分组:() 将多个字符捆绑在一起,当作一个整体处理
后向引用:\1, \2, ...
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat
8.练习
表示qq号
echo "2013075899" |grep "\b[0-9]\{6,12\}\b"、
表示邮箱echo "zhang@qq.com" |grep -E "[[:alnum:]_]+@[[:alnum:]_]+\.[[:alnum:]_]+"
表示手机号
echo "13388888888"|grep -E "\b1[3456789][0-9]{9}\b"
2.awk
1.语法
awk [选项] '表达式 {处理动作}'
表达式:找到特定的行
处理动作:print打印 printf打印
2.选项
-F 指定分隔符
-v 指定变量
-f 脚本
3.用法
[root@localhost ~]# awk '{print}'
^C
[root@localhost ~]# awk '{print}'
dd
dd
dd
dd
^C
[root@localhost ~]# awk '{print "hello"}'
1
hello
1
hello
1
hello
awk 'BEGIN {print 100*20}'
awk -F: 'BEGIN {print "hello"} {print $1}' /etc/passwd |head -n3 #先处理BEGIN 中的式子
echo {a..b} |awk '{print $1}'
df|awk '{print $5}'
cat /etc/passwd|awk -F: '{print $1"\t"$3}'|head -n2
df |awk -F"( +|%)" '{print $5}'
ifconfig ens33|grep netmask |awk '{print $2}' #提前IP地址
4.内置变量
awk 选项 '模式{print }'
1.FS :指定每行文本的字段分隔符,缺省为空格或制表符(tab)。与 “-F”作用相同 -v "FS=:"
2.OFS:输出时的分隔符
3.NF:当前处理的行的字段个数
4.NR:当前处理的行的行号(序数)
5.$0:当前处理的行的整行内容
6.$n:当前处理行的第n个字段(第n列)
7.FILENAME:被处理的文件名
8.RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n
BEGIN{}:仅在开始处理文件中的文本之前执行一次
END{}:仅在文本处理完成之后执行一次
5.条件判断
6.数组
awk数组特性:
awk的数组是关联数组(即key/value方式的hash数据结构),索引下标可为数值(甚至是负数、小数等),也可为字符串 1. 在内部,awk数组的索引全都是字符串,即使是数值索引在使用时内部也会转换成字符串 2. awk的数组元素的顺序和元素插入时的顺序很可能是不相同的
awk数组支持数组的数组
awk '{a[$1]++}END{for (i in a){print i}}' b.txt
去除重复行
提取host.txt主机名后再放回host.txt文件 >>
1 www.kgc.com
2 mail.kgc.com
3 ftp.kgc.com
4 linux.kgc.com
5 blog.kgc.com
cat host.txt |awk -F"." '{print $1}' >> host.txt
cat host.txt