600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > Shell正则表达式详解(一)

Shell正则表达式详解(一)

时间:2019-07-03 20:55:00

相关推荐

Shell正则表达式详解(一)

一、正则表达式

(一)、正则表达式定义

正则表达式通常用于判断语句中,用来检查某一字符串是否满足某一格式

正则表达式是由普通字符与元字符组成

普通字符包括大小写字母、数字、标点符号及一些其他符号

普通字符包括大小写字母、数字、标点符号及一些其他符号

元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式

(二)、基础正则表达式常见元字符:(支持的工具:grep, egrep、 sed,awk)

\:转义字符,用于取消特殊符号的含义,例:\!、 \n 、 \$等

^:匹配字符串开始的位置,例: ^a 、^the、^#、^[a-z]

$:匹配字符串结束的位置,例: word$、 ^$匹配空行

.:匹配除\n之外的任意的一个字符,例:go.d、g..d

*:匹配前面子表达式0次或者多次,例: goo*d,go.*d

[list] :匹配list列表中的一个字符,例:go [ola]d, [abc]、[a-z]、[a-z0-9]、[0-9]匹配任意一位数字

[^list]:匹配任意非list列表中的一个字符,例: [^0-9]、[^A-Z0-9]、[^a-z]

\{n\}:匹配前面的子表达式n次,例:go\{2\}d, '[0-9]\{2\}'匹配两位数字

\{n,\} :匹配前面的子表达式不少于n次,例: go\{2,\)d、 '[0-9]\{2,\},匹配两位及两位以上数字

\{n,m\} :匹配前面的子表达式n到m次,例: go\{2,3\}d、 '[0-9]\{2,3\}匹配两位到三位数字

注:egrep, awk使用{n}、{n,}、{n,m}匹配时“{}"前不用加“\”

(三)、扩展正则表达式元字符:(支持的工具: egrep、 awk)

+:匹配前面子表达式1次以上,例:go+d,将匹配至少一个o,如god, good, goood等

? :匹配前面子表达式0次或者1次,例: go?d,将匹配gd或god

() :将括号中的字符串作为一个整体,例:g(oo) +d,将匹配。整体1次以上,如good,gooood等

|:以或的方式匹配字条串,例:g(oo|la)d,将匹配good或者glad

(四)、正则表达式匹配E-mail地址

用户名@: ^ ([a-ZA-Z0-9_\-\.\+]+)@子域名: ([a-zA-Z0-9_\-\.]+)·顶级域名(字符串长度一般在2到5) : \. ( [a-zA-Z] {2,5})$egrep '^ ([a-zA-Z0-9\-\.\+]+) @ ( [a-ZA-Zo-9_\-\.]+) \. ([a-zA-Z] {2,5})$' email.txtawk '/^ ([a-zA-Z0-9_\-\.\+]+) @ ( [a-zA-Z0-9_\-\.]+)\. ( [a-zA-Z] {2,5})$/{print $o}' email.txt

(五)、举例:

首先创建一个如下的文本进行后续的实验

[root@gcc?jiaoben2]#vim zhengze.txtgdgodgoodgooodgoooodgoooabcdgoooooodddd

[root@gcc jiaoben2]#grep "goo*d" zhengze.txt#匹配前面子表达式也就是o,0次或者多次godgoodgooodgoooodgoooooodddd[root@gcc jiaoben2]#grep "go.*d" zhengze.txt #也可以使用 . 代表任意一个字符来进行匹配godgoodgooodgoooodgoooabcdgoooooodddd

#创建一个文件,里面包含只具有abc的一串字符串和具有abc中任意字符和其他字符的字符串[root@gcc jiaoben2]#vim zhengze3.txtabc123abc123[root@gcc jiaoben2]#grep "[^abc]" zhengze3.txt#使用[^list]规则进行匹配,匹配除了abc外的字符123abc123

#创建如下的文本:[root@gcc jiaoben2]#vim zhengze.txt gdgodgoodgoo1dgooo2dgoo3abcdgoo4ooodddd[root@gcc jiaoben2]#grep "go\{2\}" zhengze.txt#匹配前面的子表达式o两次得出结果goodgoo1dgooo2dgoo3abcdgoo4ooodddd

[root@gcc jiaoben2]#egrep "go+d" zhengze.txt#匹配前面子表达式o ,1次以上godgood[root@gcc jiaoben2]#egrep "g(oo)+d" zhengze.txt #如果将oo用()括起来,则将(oo)作为一个整体进行匹配good

[root@gcc jiaoben2]#egrep "go?d" zhengze.txt#匹配前面子表达式o,0次或者1次gdgod

匹配以139开头的手机号

"^139[0-9]\(8\)" #以139开头,数字从0-9,匹配8次

二、sort命令、uniq命令与tr命令

(一)、sort命令------以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序

1、语法格式:

sort [选项] 参数cat file | sort 选项

2、常用选项:

-f:忽略大小写,默认会将大写字母排在前面

-b:忽略每行前面的空格

-n:按照数字进行排序

-r:反向排序

-u:等同于uniq,表示相同的数据仅显示一行

-t:指定字段分隔符,默认使用[Tab]键分隔

-k:指定排序字段

-o <输出文件>:将排序后的结果转存至指定文件

3、举例:

首先准备一个具有如下内容的文本:

[root@gcc jiaoben2]#vim abc.txt121004533334441014575333444555155666777

[root@gcc jiaoben2]#sort abc.txt#使用 sort 文件名 是使文件中的数字按照首字母大小进行排序110100145155233333334444444555566675777

[root@gcc jiaoben2]#sort abc.txt -n#使用 -n 选项可以将文件中的数字按顺序进行排序123104575100145155333333444444555666777

[root@gcc jiaoben2]#sort abc.txt -nr#使用 -nr 两个选项使文件中的数字反向排序777 666555444444333333155145100754510321

[root@gcc jiaoben2]#sort abc.txt -nru #再在之前反向排序的基础上添加 -u 选项可以实现去重的作用777666555444333155145100754510321

[root@gcc?jiaoben2]#cat /etc/passwd | sort -t ':' -k 3 -n #将/etc/passwd中的内容使用“|”交给sort进行排序,-t ‘:’是指定分隔符为冒号;-k 3 是指定排序字段为第三段;-n 是指定将数字进行顺序排序root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

[root@gcc jiaoben2]#du -a#补充一点,du -a 是统计当前目录所有文件与其占用的空间4./a.sh4./b.sh4./c.sh4./d.sh4./e.sh4./f.sh4./g.sh4./h.sh4./j.sh4./k.sh4./abc.txt44.

[root@gcc jiaoben2]#du -a | sort -nr -o du.txt#将当前目录统计的结果降序排序保存到当前目录下的du.txt文件中,如果没有该文件则自动创建。[root@gcc jiaoben2]#lsabc.txt b.sh d.sh e.sh g.sh j.sha.shc.sh du.txt f.sh h.sh k.sh[root@gcc jiaoben2]#cat du.txt 44.4./k.sh4./j.sh4./h.sh4./g.sh4./f.sh4./e.sh4./d.sh4./c.sh4./b.sh4./a.sh4./abc.txt0./du.txt

(二)、uniq命令------用于报告或者忽略文件中连续的重复行,常与sort命令结合使用

1、语法格式:

uniq [选项] 参数cat file | uniq 选项

2、常用选项:

-c:进行计数,并删除文件中连续重复出现的行

-d:仅显示连续的重复行

-u:仅显示不连续的只出现一次的行

3、举例:

首先创建如下的文本进行实验:

[root@gcc jiaoben2]#vim efg.txt112233333344445555223344

[root@gcc jiaoben2]#uniq efg.txt #直接使用uniq+文件名 将文件中重复的行去掉1122334455223344

[root@gcc jiaoben2]#uniq efg.txt -c #使用 -c 选项进行计数,并删除文件中连续重复出现的行。第一列是该数字连续重复出现的次数1 111 223 332 442 551 221 331 44

[root@gcc jiaoben2]#uniq efg.txt -d#-d 选项仅显示连续出现的重复行334455

[root@gcc jiaoben2]#uniq efg.txt -u#仅显示不连续的只出现一次的行1122223344

(三)、tr命令-----常用来对来自标准输入的字符进行替换、压缩和删除

1、语法格式:

tr [选项] [参数]

2、常用选项:

-c:保留字符集1的字符,其他的字符(包括换行符\n)用字符集2替换

-d:删除所有属于字符集1的字符

-s:将重复出现的字符串压缩为一个字符串;用字符集2替换字符集1

-t:字符集2替换字符集1,不加选项同结果

3、参数:

字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数“字符集2"指定转换的目标字符集。但执行删除操作时,不需要参数"字符集2"。

字符集2:指定要转换成的目标字符集。

4、举例:

[root@gcc jiaoben2]#echo "abc" | tr 'a-z' 'A-Z'#用A-Z替换a-zABC[root@gcc jiaoben2]#echo "abc" | tr -t 'a-z' 'A-Z'#加 -t 的效果和上面一样的ABC[root@gcc jiaoben2]#echo -e "abc\nabcdab" | tr -c "ab\n" "0" #将除了ab和\n(换行符)以外的所有字符用0替换ab0 ab00ab[root@gcc jiaoben2]#echo "hello world" | tr -d "od" #使用-d 将字符集中的字符删除hell wrl[root@gcc jiaoben2]#echo 'hello world' | tr -d 'od' #使用“”和使用‘’的作用一样hell wrl [root@gcc jiaoben2]#echo "hellllo worrrld" | tr -s 'lr'#使用 -s 将重复的字符串压缩为一个字符helo world[root@gcc jiaoben2]#echo "hellllo worrrld" | tr -s 'lr' "32" #也可以压缩之后再用字符串2进行替换压缩的字符he3o wo23d

也可以使用tr和sort命令进行数组的排序

root@gcc?jiaoben2]#arr=(2 1 7 4 3)[root@gcc?jiaoben2]#echo ${arr[*]}2 1 7 4 3[root@gcc?jiaoben2]#echo ${arr[*]} | tr ' ' '\n' | sort -n >file #使用tr将空格转换成换行符;使用sort -n 将数字进行顺序排序;然后将新的排序后的结果输出到新的文件file中[root@gcc?jiaoben2]#cat file 12347

(四)、注意

Linux中遇到换行符("\n")会进行回车+换行的操作,回车符反而只会作为控制字符("^M")显示,不发生回车的操作。而windows中要回车符+换行符("\r\n")才会回车+换行,缺少一个控制符或者顺序不对都不能正确的另起一行。

当我们在windows系统中创建一个具有回车符的文本上传至linux系统中时,它的回车符会转换成“^M”显示

那么我们就可以使用 -s 选项将回车符换成空格符然后进行压缩后输出

总结

正则表达式

sort命令,uni'q命令与tr命令

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。