Linux之正则表达式
什么是正则表达式?
简单地说,正则表达式就是处理字符串的方法,它以行为单位来进行字符串的处理操作,正则表达式通过一些特殊符号的辅助,可以让用户轻易地完成【查找、删除、替换】某特定字符串的处理过程。
正则表达式基本上是一种**【表示法】**,只要程序支持这种表示法,那么该程序就可以用来作为正则表达式的字符串处理。
正则表达式的字符串表示方式依照不同的严谨度分为:基础正则表达式、扩展正则表达式。
用途:邮件服务器
注意:正则表达式与通配符是完全不一样的东西,因为【通配符代表的是bash操作接口的一个功能】,但是正则表达式则是一种字符串处理的方式。使用正则表达式的时候,需要特别注意当时环境的语系,否则可能会发现选取的结果不合人意。
一、基础正则表达式
1、符号的含义
“ [:alnum:] ”代表英文大小写字符及数字,亦即 0 ~ 9、A ~ Z、a ~ z
“ [:alpha:] ”代表任何英文大小写字符,亦即 A ~ Z、a ~ z
“ [:blank:] ”代表空格键与[Tab]键
“ [:cntrl:] ”代表键盘上面 控制键,包括CR、LF、Tab、Del
“ [:digit:] ”代表数字,亦即 0 ~ 9
“ [:graph:] ”代表空格符以外的所有按键
“ [:lower:] ”代表英文小写字符,亦即 a ~ z
“ [:print:] ”代表任何可以被打印出来的字符
“ [:punct:] ”代表标点字符,亦即 " ’ ? ! ; : # $
“ [:upper:] ”代表英文大写字符,亦即 A ~ Z
“ [:space:] ”代表任何会产生的空白的字符,包括空格、Tab键、CR等
“ [:xdigit:] ”代表十六进制的数字类型
案例一:查看a.txt文件中所有含有数字的行
语法:cat a.txt | grep '[[:digit:]]'
2、行首字符 ’ ^ ’ 与行为字符 ’ $ ',“ ^ ”在字符集合符号([ ])中是表示反向,在外面表示定位在行首的意思
案例二:列出 /bin 目录下所有以d开头的文件
3、任意一个字符
“ . ”表示【一定有一个任意字符】
“ * ”表示【重复前一个字符0次或N次】
注意:【.*代表零个或者多个任意字符】
案例三:获取 /bin 目录下以a开头h结尾且位数为四位的目录
语法:ls /bin | grep '^a…h$'
案例四:获取 /bin 目录下最少含有两个连续ee的目录
语法:ls /bin | grep ‘eee*’
4、限定连续RE字符范围{}
如果想要限制次数获取的范围,可以使用{},但是因为 { 和 } 在shell中是有特殊意义的,所有需要转义符 \ 来使它们有意义。
案例五:获取 /bin 目录下含有四个字符的目录
语法:ls | grep '^.{4} $'
5、sed工具(重点)
当我们分析日志文件的时候,绝大部分需要分析关键词的使用、统计等,可以使用sed工具来实现。sed本身也是一个管道命令,可以分析标准输入。而且sed还可以将数据进行替换、删除、新增、选取特定行等功能。
语法:sed [-nefr] [操作]
“ -n ”表示只有经过sed特殊处理的那一行才会被列出
“ -e ”表示直接在命令行模式上进行sed的操作编辑
“ -f ”表示直接将sed的操作卸载一个文件内
“ -r ”表示使用扩展性正则表达式(默认是基础正则表达式)
操作说明: [n1,n2] function
“ n1,n2 表示行号 ”
“ a ”表示新增,后面可以接字符,这些字符会显示在新的一行
“ c ”表示替换,后面接字符,这些字符会替换n1,n2之间的行
“ d ”表示删除
“ i ”表示插入,后面接字符,这些字符会在新的一行出现
“ p ”表示打印
“ s ”表示可以直接进行替换操作
案例六:列出a.txt文件并打印行号,同时删除2-5行的内容如果需要删除第3行开始到最后一行,可以使用 nl a.txt | sed '3,
d
′
,
d',
d′, 表示最后一行
案例七:替换a.txt文件中第一行的内容为Hello World
语法:nl a.txt | sed '1c Hello World’
部分数据的查找并替换的功能(重点):
语法:sed 's/要被替换的字符/新的字符/g’
案例八:获取 /etc/man_db.conf 中MAN存在的几条数据,但是含义#在内的注释不
要,而且空白行不要
语法:*cat /etc/man_db.conf | grep ‘MAN’ | sed '/#.s//g’ | sed ‘/^$/d’
二、扩展正则表达式
符号含义
“ + ”表示重复【一个或一个以上】的前一个RE字符
“ ? ”表示【零个或一个】前一个RE字符
“ | ”表示【或(or)的方式找出字符串】
“ () ”表示找出【群组】字符串
“ ()+ ”表示多个重复群组的判别
三、文件的格式化与相关处理
1、格式化打印
语法:printf ‘打印内容’ 实际内容
特殊格式:
“ \a ”表示警告声音输出
“ \b ”表示退格键
“ \f ”表示清除屏幕
“ \n ”表示输出新的一行
“ \r ”表示回车按键
“ \t ”表示水平的tab键
“ \v ”表示垂直的tab键
“ \xNN ”表示NN为两位数,可以转换数字成字符
2、数据处理工具:awk
sed常常用于一整行的处理,awk更倾向于一行当中分成数个字段来处理。awk主要处理每一行的字段内的数据(字段为最小的处理单位),而默认的字段的分隔符为空格键或者Tab键。
语法:awk ‘条件类型1{操作1} 条件类型2{操作2}’
案例九:列出最后5位登录用户并打印出第一个、第三个字段
语法:last -n 5 | awk ‘{print $1 “\t” $3}’
四、文件比对工具
1、比对两个文件之间的差距
语法:diff [-bBi] 文件1 文件2
“ -b ”表示忽略一行当中,仅有多个空白的差异
“ -B ”忽略空白行的差异
“ -i ”忽略大小写“ 12,14d11 ”表示左边第12,14行被删除(d)掉了,基准是右边的第11行
“ < ”表示左边的内容
“ > ”表示右边的内容
2、cmp(主要用于对比文件,主要利用字节单位对比,也可以对比二进制文件)
语法:cmp 文件1 文件2