Linux学习记录 正则表达式与其应用

本文发布时间: 2019-Mar-22
正则表达式与其应用数据处理工具:awk,sed正则表达式基本上是一种“表示法”,只要工具程序支持这种表示法,那么该工具程序就可以用来作为正则表达式的字符串处理只用。例如vi,grep,awk,sed等工具正则表达式特殊符号语系对应正在表达式也会存在影响。比如LANG=C时:01234…ABCD..Zabcd..zLANG=ZH_CN时:01234…aAbBcCdD…….因此[a-z]当C语系时代表的意义是获取小写字母。在ZH_CN语系时代表的意义就是获取字母(大写与小写)为了避免数字和字母的选取错误,正则表达式采用特殊符号来代表[:alnum:]:代表英文大小写字符及数字。A-Za-z0-9[:alpha:]:代表英文大小写字符A-Za-z[:blank:]:代表空格与TAB键[:cntrl:]:代表键盘上的控制按键CR,LF,TAB,DEL等[:digit:]:代表数据0-9[:graph:]:代表除了空格与TAB键的其他所有按键[:lower:]:代表小写字符[:upper:]:代表大写字符[:print:]:代表任何可以被打印出来了的字符[:punct:]:代表标点符号字符[:space:]:代表会产生的空白的字符如TAB空格CR[:xdigit:]:代表十六进制的数字类型0-9A-Fa-f举例[root@localhost~]#catxargsfile|grep-n'[[:upper:]]'2:FRA4:AWEE基础正则表达式字符字符意义与范例^word意义:查找以word为行首的数据举例:查找以#开始的那一行gerp‘^#’file.txtWord$意义:查找以word为行尾的数据举例:查找以#为结尾的那一行grep‘#$’file.txt.意义:代表一定有一个任意字符举例查找字符串eae,ebeee,ee之间一定有一个字符,空格也算字符Grep‘e.e’file.txt*意义:重复0个到无穷个前一个字符举例:查找含有esessesss等的字符串grep‘ess*’file.txt[]意义:从字符集合中找出想要选取的字符举例:查找含有gl或gd的那一行grep‘g[ld]’file.txt[n1-n2]意义:从字符集合里找出想要选取的字符范围举例:查找含有任意数字的哪一行grep‘[0-9]’file.txt[^]意义:从字符集合中找处不要的字符或范围举例:查找不含大写字母的那一行grep‘[^A-Z]’file.txt\{n,m\}意义:连续n个到m个的前一个字符,如\{n\}则是连续n个前一个字符,如\{n,\}则是连续n个以上前一个字符举例1:查找g与g之间包含2个到3个o的字符串如:googgoooggrep‘\{2,\3}’file.txt举例2:查找g与g之间包含2个o的字符串如:googgrep‘\{2\}’file.txt举例3:查找g与g之间包含3个及以上o的字符串如:gooog,gooood,goo….odgrep‘\{3,\}’file.txt扩展正则表达式字符意义与范例+意义:重复一个或一个以上的字符举例:查找god,good,good等字符串egrep‘go+d’file.txt?意义:0个过1个前一个字符举例:查找gdgodegrep‘go?d’file.txt|意义:用或的方式找出数个字符串举例:找出my,ownegrep‘my|own’file.txt()意义:找出“组“的字符串举例:找出good或gladegrep‘g(oo|la)d’file.txt()+意义:多个重复组的判别举例:找出Axy123123123Cegrep‘Axy(123)+C’file.txt说明:如grep需要使用扩展正则表达式,可使用grep–e或egrepsedsed本身是一个也是一个管道命令。可以分析输入数据流,还可以将数据进行替换,删除,选去等操作sed与tr的区别tr操作的单元是字符,它针对字符进行删除和替换sed操作单元的是行,它针对行进行删除和替换sed与vim的区别sed是管道命令它修改只是输入数据流,并不会修改文件本身。虽然sed也可以直接修改文件,但是不需要打开文件,对于大文件来说很有帮助vim是文本编辑器,它修改的是文件本身语法:sed[-nefr]‘动作’选项与参数:-n:silent模式,只将sed处理过的内容显示i出来-e:设置多个sed动作-ffilename:文件内记录sed脚本scipt-r:sed支持的扩展正则表达式语法(默认是基础正则表达式)-i:直接修改读取文件内容,而不是屏幕输出动作:n1,n2functionn1,n2不一定存在function:a:新增,a后面接字符串,这些字符在当前的下一行显示c:替换,c后面接字符串,这些字符替换n1-n2之间的行d:删除,删除n1-n2之间的行i:添加,i后面接字符串,这些字符在当前的上一行显示p:打印,打印n1~n2行之间的数据s:替换以关键字形式替换,并不是替换整行.sed‘s/旧字符串/新字符串/g’’举例:[root@localhost ~]# cat sedfile |sed -n 'p' =>查询所有内容line 1line 2line 3line 4line 5line 6line 7line 8line 9line 10[root@localhost ~]# cat sedfile |sed -n '1,4p'=>查询1~4内容line 1line 2line 3line 4[root@localhost ~]# cat sedfile |sed '2a new line'|sed -n '1,5p'=>在第2行下添加新的一行line 1line 2new lineline 3line 4[root@localhost ~]# cat sedfile |sed '3d'|sed -n '1,4p'=>删除第3行line 1line 2line 4line 5[root@localhost ~]# cat sedfile |sed '2i insert line'|sed -n '1,5p'=>在第2行上添加新的一行line 1insert lineline 2line 3line 4[root@localhost ~]# cat sedfile |sed '2,3c replace line'|sed -n '1,3p'=>替换2~3行line 1replace lineline 4[root@localhost ~]# cat sedfile |sed '1,3s/ne/NEL/g'|sed -n '1,6p'=>用NEL替换2~3行的neliNEL 1liNEL 2liNEL 3line 4line 5line 6举例2:使用sed直接修改文件[root@localhost ~]# sed -i '$a this is line' sedfile ;cat sedfile|tail -n 2 line 10this is lineawk(awk功能很强大,这里只是功能介绍性说明)Awk是一个数据处理工具,相比sed作用于一整行的处理,awk则将一行分为数个“字段”处理awk的处理流程1.读入第一行,并将第一行的数据填入$0,$1,$2……等变量中2.依据条件类型的限制,判断是否需要后面的动作3.做完所有的动作与条件类型4.若还有后续的行的数据,则重复1-3步骤语法:awk‘条件类型1{动作1}条件类型2{动作2}……’filename说明:1.awk默认用空格或tab来分割一行数据,并将数据填充到$1,$2..中如:rootpts1192这一行,$1=root$2=pts1.2.awk后方语句中非变量需使用双引号来定义,变量可以直接使用awk内置变量变量描述$n当前记录的第n个字段,字段间由FS分隔。$0完整的输入记录。ARGC命令行参数的数目。ARGIND命令行中当前文件的位置(从0开始算)。ARGV包含命令行参数的数组。CONVFMT数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组。ERRNO最后一个系统错误的描述。FIELDWIDTHS字段宽度列表(用空格键分隔)。FILENAME当前文件名。FNR同NR,但相对于当前文件。FS字段分隔符(默认是任何空格)。IGNORECASE如果为真,则进行忽略大小写的匹配。NF当前记录中的字段数。NR当前记录数。OFMT数字的输出格式(默认值是%.6g)。OFS输出字段分隔符(默认值是一个空格)。ORS输出记录分隔符(默认值是一个换行符)。RLENGTH由match函数所匹配的字符串的长度。RS记录分隔符(默认是一个换行符)。RSTART由match函数所匹配的字符串的第一个位置。SUBSEP数组下标分隔符(默认值是\034)。awk运算符运算符描述=+=-=*=/=%=^=**=赋值?:C条件表达式||逻辑或&&逻辑与~~!匹配正则表达式和不匹配正则表达式<<=>>=!===关系运算符空格连接+-加,减*/&乘,除与求余+-!一元加,减和逻辑非^***求幂++--增加或减少,作为前缀或后缀$字段引用in数组成员举例1:查看$1NRNF[root@bogon ~]# last -n 5 | awk '{print $1 "\t lines: " NR "\t cols: "NF }'root lines: 1 cols: 10root lines: 2 cols: 9root lines: 3 cols: 9reboot lines: 4 cols: 9root lines: 5 cols: 10举例2:带有条件的,仅输出$1==root的数据[root@bogon ~]# last -n 5 | awk '$1=="root" {print $1 "\t lines: " NR "\t cols: "NF }'root lines: 1 cols: 10root lines: 2 cols: 9root lines: 3 cols: 9root lines: 5 cols: 10awk关键字BEGINBEGIN关键字作用是预设,在读如第一行前面就执行BEGIN后面的动作比如每一行默认分割方式是空格或是TAB,所以我们可以设置FS来改变分割符,但是此时第一行数据已经读取分析完毕,列信息已经存在$1,$2..中,改变只能从第2行开始。举例:[root@bogon ~]# cat /etc/passwd|head -n 5 |awk 'BEGIN {FS=":"} NR=="1" {print"UID\tGID"} NR>="1" {print $1 "\t" $3}'UID GIDroot 0bin 1daemon 2adm 3lp 4举例2计算数据(num1+num2)数据文件month:num1:num21:100:1502:200:2503:300:3504:400:4505:500:5506:600:650[root@bogon ~]# cat cal.file |awk 'BEGIN {FS=":"} NR=="1" {print$1"\t"$2"\t"$3"\ttotal"} NR>"1" {print$1"\t"$2"\t"$3"\t"$2+$3}'month num1 num2 total1 100 150 2502 200 250 4503 300 350 6504 400 450 8505 500 550 10506 600 650 1250ENDEND操作将在扫描完全部的输入之后执行举例:[root@bogon ~]# cat cal.file |awk 'BEGIN {FS=":"} NR=="1" {print$1"\t"$2"\t"$3"\ttotal"} NR>"1" {print$1"\t"$2"\t"$3"\t"$2+$3} END {print "sum"}'month num1 num2 total1 100 150 2502 200 250 4503 300 350 6504 400 450 8505 500 550 10506 600 650 1250sum


(以上内容不代表本站观点。)
---------------------------------
本网站以及域名有仲裁协议。
本網站以及域名有仲裁協議。

2024-Mar-04 02:10pm
栏目列表