Shell正则表达式详解(一)

一、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.txt

1
2
100
45
3
333
444
10
145
75
333
444
555
155
666
777
[root@gcc jiaoben2]#sort abc.txt      #使用 sort 文件名  是使文件中的数字按照首字母大小进行排序
1
10
100
145
155
2
3
333
333
444
444
45
555
666
75
777
[root@gcc jiaoben2]#sort abc.txt -n      #使用 -n 选项可以将文件中的数字按顺序进行排序
1
2
3
10
45
75
100
145
155
333
333
444
444
555
666
777
[root@gcc jiaoben2]#sort abc.txt -nr      #使用 -nr 两个选项使文件中的数字反向排序
777  
666
555
444
444
333
333
155
145
100
75
45
10
3
2
1
[root@gcc jiaoben2]#sort abc.txt -nru       #再在之前反向排序的基础上添加 -u 选项可以实现去重的作用
777
666
555
444
333
155
145
100
75
45
10
3
2
1
[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/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@gcc jiaoben2]#du -a     #补充一点,du -a 是统计当前目录所有文件与其占用的空间
4	./a.sh
4	./b.sh
4	./c.sh
4	./d.sh
4	./e.sh
4	./f.sh
4	./g.sh
4	./h.sh
4	./j.sh
4	./k.sh
4	./abc.txt
44	.
[root@gcc jiaoben2]#du -a | sort -nr -o du.txt      #将当前目录统计的结果降序排序保存到当前目录下的du.txt文件中,如果没有该文件则自动创建。
[root@gcc jiaoben2]#ls
abc.txt  b.sh  d.sh    e.sh  g.sh  j.sh
a.sh     c.sh  du.txt  f.sh  h.sh  k.sh
[root@gcc jiaoben2]#cat du.txt 
44	.
4	./k.sh
4	./j.sh
4	./h.sh
4	./g.sh
4	./f.sh
4	./e.sh
4	./d.sh
4	./c.sh
4	./b.sh
4	./a.sh
4	./abc.txt
0	./du.txt

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

1、语法格式:

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

2、常用选项:
-c:进行计数,并删除文件中连续重复出现的行
-d:仅显示连续的重复行
-u:仅显示不连续的只出现一次的行

3、举例:
首先创建如下的文本进行实验:

[root@gcc jiaoben2]#vim efg.txt
11
22
33
33
33
44
44
55
55
22
33
44
[root@gcc jiaoben2]#uniq efg.txt       #直接使用uniq+文件名 将文件中重复的行去掉
11
22
33
44
55
22
33
44
[root@gcc jiaoben2]#uniq efg.txt -c    #使用 -c 选项进行计数,并删除文件中连续重复出现的行。第一列是该数字连续重复出现的次数
      1 11
      1 22
      3 33
      2 44
      2 55
      1 22
      1 33
      1 44
[root@gcc jiaoben2]#uniq efg.txt -d      #-d 选项仅显示连续出现的重复行
33
44
55
[root@gcc jiaoben2]#uniq efg.txt -u     #仅显示不连续的只出现一次的行
11
22
22
33
44

(三)、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-z
ABC
[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 
1
2
3
4
7

(四)、注意

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

当我们在windows系统中创建一个具有回车符的文本上传至linux系统中时,它的回车符会转换成“^M”显示
在这里插入图片描述
在这里插入图片描述
那么我们就可以使用 -s 选项将回车符换成空格符然后进行压缩后输出
在这里插入图片描述

二、正则表达式

(一)、正则表达式定义

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

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

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

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

(二)、基础正则表达式常见元字符:(支持的工具: 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.txt
awk '/^ ([a-zA-Z0-9_\-\.\+]+) @ ( [a-zA-Z0-9_\-\.]+)\. ( [a-zA-Z] {2,5})$/{print $o}'  email.txt

(五)、举例:

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

[root@gcc?jiaoben2]#vim zhengze.txt
gd
god
good
goood
gooood
goooabcd
goooooodddd
[root@gcc jiaoben2]#grep "goo*d" zhengze.txt      #匹配前面子表达式也就是o,0次或者多次
god
good
goood
gooood
goooooodddd

[root@gcc jiaoben2]#grep "go.*d" zhengze.txt    #也可以使用 . 代表任意一个字符来进行匹配
god
good
goood
gooood
goooabcd
goooooodddd
#创建一个文件,里面包含只具有abc的一串字符串和具有abc中任意字符和其他字符的字符串
[root@gcc jiaoben2]#vim zhengze3.txt
abc
123
abc123

[root@gcc jiaoben2]#grep "[^abc]" zhengze3.txt     #使用[^list]规则进行匹配,匹配除了abc外的字符
123
abc123
#创建如下的文本:
[root@gcc jiaoben2]#vim zhengze.txt 
gd
god
good
goo1d
gooo2d
goo3abcd
goo4ooodddd

[root@gcc jiaoben2]#grep "go\{2\}" zhengze.txt      #匹配前面的子表达式o两次得出结果
good
goo1d
gooo2d
goo3abcd
goo4ooodddd
[root@gcc jiaoben2]#egrep "go+d" zhengze.txt     #匹配前面子表达式o ,1次以上
god
good

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

匹配以139开头的手机号

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

猜你喜欢

转载自blog.csdn.net/Gengchenchen/article/details/111626730
今日推荐