正则表达式(全)

目录

单括号,双括号,中括号,双中括号,大括号

单括号:

双小括号:

中括号:

双中括号:

大括号:

Echo的用法

正则表达式定义:

正则表达式组成

普通字符:

元字符

扩展元字符

使用grep匹配正则

示例:

总结:元字符

正则工具

Cut工具

Sort工具

Uniq工具

Tr工具

Sed工具:

单括号,双括号,中括号,双中括号,大括号

单括号

1.命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。

2.命令替换。等同于cmd,shell扫描一遍命令行,发现了( c m d ) 结 构 , 便 将 (cmd)结构,便将(cmd)结构,便将(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令。有些shell不支持,如tcsh。

3.用于初始化数组。如:array=(a b c d)

双小括号:

1.整数扩展。这种扩展计算是整数型的计算,不支持浮点型。((exp))结构扩展并计算一个算术表达式的值,如果表达式的结果为0,那么返回的退出状态码为1,或者 是"假",而一个非零值的表达式所返回的退出状态码将为0,或者是"true"。若是逻辑判断,表达式exp为真则为1,假则为0。

2.只要括号中的运算符、表达式符合C语言运算规则,都可用在$((exp))中,甚至是三目运算符。作不同进位(如二进制、八进制、十六进制)运算时,输出结果全都自动转化成了十进制。如:echo $((16#5f)) 结果为95 (16进位转十进制)

3.单纯用 (( )) 也可重定义变量值,比如 a=5; ((a++)) 可将 $a 重定义为6

4.常用于算术运算比较,双括号中的变量可以不使用$符号前缀。括号内支持多个表达式用逗号分开。 只要括号中的表达式符合C语言运算规则,比如可以直接使用for((i=0;i<5;i++)), 如果不使用双括号, 则为for i inseq 0 4或者for i in {0..4}。再如可以直接使用if (($i<5)), 如果不使用双括号, 则为if [ $i -lt 5 ]。

((expr  ))通常作为运算的

中括号

1.bash 的内部命令,[和test是等同的。如果我们不用绝对路径指明,通常我们用的都是bash自带的命令。if/test结构中的左中括号是调用test的命令标识,右中括号是关闭条件判断的。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码。if/test结构中并不是必须右中括号,但是新版的Bash中要求必须这样。

2.Test和[]中可用的比较运算符只有=和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。无论是字符串比较还是整数比较都不支持大于号小于号。如果实在想用,对于字符串比较可以使用转义形式,如果比较"ab"和"bc":[ ab \< bc ],结果为真,也就是返回状态为0。[ ]中的逻辑与和逻辑或使用-a 和-o 表示。且[]前后都有空格。

3.字符范围。用作正则表达式的一部分,描述一个匹配的字符范围。作为test用途的中括号内不能使用正则。

4.在一个array 结构的上下文中,中括号用来引用数组中每个元素的编号。

双中括号

1.[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。

2.支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。

3.使用[[ … ]]条件判断结构,而不是[ … ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不适用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。

4.bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

大括号

1.大括号拓展。(通配(globbing))将对大括号中的文件名做扩展。在大括号中,不允许有空白,除非这个空白被引用或转义。第一种:对大括号中的以逗号分割的文件列表进行拓展。如 touch {a,b}.txt 结果为a.txt b.txt。第二种:对大括号中以点点(…)分割的顺序文件列表起拓展作用,如:touch {a…d}.txt 结果为a.txt b.txt c.txt d.txt

2.代码块,又被称为内部组,这个结构事实上创建了一个匿名函数 。与小括号中的命令不同,大括号内的命令不会新开一个子shell运行,即脚本余下部分仍可使用括号内变量。括号内的命令间用分号隔开,最后一个也必须有分号。{}的第一个命令和左括号之间必须要有一个空格。{}也可以用于多行注释,作为函数包起来只是不调用即可。

[ a /< b ]实际上比的是ascll码的值,其中a,b表示的并不是变量,如果需要比较变量则需要在前面增加$符号。

Echo的用法

Echo -n表示不换行输出

Echo -e表示输出转移字符,将转义后的内容输出到屏幕上

常用的转义字符如下:

\b:转义后相当于按退格键(backspace),但前提是"\b"后面存在字符;"\b"表示删除前一一个字符,"\b\b”表示删除前两个字符。

\c:不换行输出,在"\c"后面不存在字符的情况下,作用相当于echo -n;但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出。

\n:换行,被输出的字符从"\n"处开始另起一行。

\f换行,但是换行后的新行的开头位置连接着上一行的行尾;

\v '与\f相同;

\t转以后表示插入tab,即横向制表符;

\r光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符:但是当"\r"后面不存在任何字符时,"\r"前面的字符不会被覆盖

\\表示插入"\"本身;

正则表达式定义

正则表达式,又称正规表达式、常规表达式,使用字符串来描述、匹配一系列符合某个规则的字符串。

正则表达式组成

普通字符

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

元字符:

在正则表达式中具有特殊意义的专用字符

元字符

\:转义字符,\!、\n等

^:匹配字符串开始的位置

例: ^a、^the、^#

$:匹配字符串结束的位置

例: word$

.:匹配除\n之外的任意的一个字符

例: go.d、g..d

*:匹配前面子表达式0次或者多次

例:goo*d、go.*d

[list]:匹配list列表中的一个字符

例: go[ola]d,[abc]、[a-z]、[a-z0-9]

[^list]:匹配任意不在list列表中的一个字符

例: [^a-z]、[^0-9]、[^A-Z0-9]

\{n,m\}:匹配前面的子表达式n到m次,有\{n\}、\{n,\}、\{n,m\}三种格式

例:go\{2\}d、go\{2,3\}d、go\{2,\}d

扩展元字符

       +:匹配前面子表达式1次以上

例: go+d,将匹配至少一个o

?:匹配前面子表达式0次或者1次

例: go?d,将匹配gd或god

():将括号中的字符串作为一个整体

例:(xyz)+,将匹配 xyz 整体1次以上,如xyzxyz

|:以或的方式匹配字条串

例1: good|food,将匹配good或者food

例2: g(oo|la)d,将匹配good或者glad

使用grep匹配正则

       Grep 【选项】 查找条件 目标文件

-w:表示精确匹配

-E :开启扩展(Extend)的正则表达式

-c : 计算找到'搜寻字符串'的次数

-i :忽略大小写的不同,所以大小写视为相同

-o :只显示被模式匹配到的宁符串

-v:反向选择,亦即显示出没有'搜寻字符串′内容的那一行! (反向查找,输出与查找条件不相符的行)--color=auto : 可以将找到的关键词部分加上颜色的显示喔!

-n :顺便输出行号

      

基础正则表达式常见元字符

\:转义符,将特殊字符进行转义,忽略其特殊意义a\.b匹配a.b,但不能匹配ajb,.被转义为特殊意义\\\

^:匹配行首,^则是匹配字符串的开始^tux匹配以tux开头的行^^^^

$:匹配行尾,$则是匹配字符串的结尾tux$匹配以tux结尾的行$$$$

.:匹配除了换行符 \r\n之外的任意单个字符

[list]:匹配list列表中的一个字符

例: go[ola]d,[abc]、[a-z]、[a-z0-9]

[^list]:匹配任意不在list列表中的一个字符

例: [^a-z]、[^0-9]、[^A-Z0-9]

\{n,m\}:匹配前面的子表达式n到m次,有\{n\}、\{n,\}、\{n,m\}三种格式

例:go\{2\}d、go\{2,3\}d、go\{2,\}d

示例

  1. 查找特定字符

例如在test.txt文件中,多写了一个the,我想单独把the找出来,其中grep中-n表示显示行号,-i是区分大小写

  1. 使用-i命令表示不区分大小写

  1. 使用-v命令查找不包含“the”字符的行,并且配合-n一起使用显示行号

这里我将所有字符全部写在了一行,所以过滤的时候会将整行过滤。

  1. 利用中括号“【】”来查找集合字符

想要查找“shirt”与“short”这两个字符串时,可以发现这两个字符串均包含“sh”与“rt”。此 时执行以下命令即可同时查找到“shirt”与“short”这两个字符串,其中“[]”中无论有几个字符, 都仅代表一个字符,也就是说“[io]”表示匹配“i”或者“o”

4)若查找“oo”前面不是“w”的字符串,只需要通过集合字符的反向选择“[^]”来实现该目的。

例如执行“grep -n‘[^w]oo’test.txt”命令表示在 test.txt 文本中查找“oo”前面不是“w”的字符串。 发现这里还是存在二者均包含“w”。其实通过执行结果就可以看出,符合匹配标准的字符加粗显示,而上述结果中可以得知,

“#woood #”中加粗显示的是“ooo”,而“oo”前面的“o”是符合匹配规则的。同理“#woooooood #” 也符合匹配规则。若不希望“oo”前面存在小写字母,可以使用“grep -n‘[^a-z]oo’test.txt”命令实现,其中“a-z”表示小写字母,大写字母则通过“A-Z”表示。

grep -n '[^a-z]oo' test.txt

发现这里还存在大写字母想要去掉大写字母可以使用[^A-Z]

Grep -n ‘[^A-Z]oo’ test.sh

5)查找包含数字的行可以通过grep -n ‘[0-9]’ test.txt

6)查找行首“^” 与行尾字符:“$基础正则表达式包含两个定位元字符:“^”(行首)与“$”(行尾)。在上面的示例中, 查询“the”字符串时出现了很多包含“the”的行,如果想要查询以“the”字符串为行首的行,则 可以通过“^”元字符来实现”

Grep -n ‘^the’ test.txt

不想以英文开头则使用:

Grep -n ‘^[^a-zA-Z]’

7)”符号在元字符集合“[]”符号内外的作用是不一样的,在“[]”符号内表示反向选择,在“[]” 符号外则代表定位行首。反之,若想查找以某一特定字符结尾的行则可以使用“$”定位符。

例如,执行以下命令即可实现查询以小数点(.)结尾的行。因为小数点(.)在正则表达式

中也是一个元字符(后面会讲到),所以在这里需要用转义字符“\”将具有特殊意义的字符转

化成普通字符。

Grep -n ‘\.$’ test.txt

查询空白行:

Grep -n ‘^$’ test.txt

8)过滤空行和注释且注入到文件中

grep -v "^$\|^#" k.txt >2.txt

9)过滤出ip

Grep -o “[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+” /etc/sysconfig/network-scripts/ifcfg-ens33,+表示钱买你的字符串出现一次或多次,而*表示前面的字符出现0次1次或多次。

10)*表示匹配0次一次或多次

Grep -n “go[al]*d” test

表示其中al可以出现0次1次和多次

Grep -n “go[al]\{2\}d” test表示al出现两次

Grep -n “go[al]\{2,\}d” test在次数的后面加,表示至少不少于2次

Grep -n “go[al]\{2,5\}d” test表示出现2-5次

扩展:

Egrep -E -n ‘go[2]d’ test

Egrep即为grep的增强版功能,在使用的时候需要注意,它不再是使用双引号而是单引号,且在使用时,不需要再加转义符即\

Egrep -n ‘of|is|on’ test查询of,is,on字符串,其中的|意思并不是管道符而是(或)

Egrep -E -n ‘t(e|s)st’ test

Egrep -E -n ‘t(e|s)*st’ test

查询以t开头t结尾,中间包含至少一个o的字符串,执行以下命令即可实现

Grep -n ‘ts*t’ test

查询以t开头以t结尾,中间的s可有可无的命令

Grep -n ‘ts.*t’ test

查询以t开头以t结尾,且中间出现es次数不限

Grep -n “^t[(es)]t$” test

Grep -n ‘t\(es\)\{1,2\}t’ test

总结:元字符

通过上面几个简单的示例,可以了解到常见的基础正则表达式的元字符主要包括以下几个

^ 匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配”^”字符本身,请使用"\^"

$ 匹配输入字符串的结尾位置。如果设置了RegExp对象的 Multiline属性,则"$”也匹配'\n'或'\r’,。要匹配”$"字符本身,请使用”\$"

. 匹配除"\r\n"之外的任何单个字符

\ 反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的特殊意义

* 匹配前面的子表达式零次或多次。要匹配“*"字符,请使用“\*”

[] 字符集合,匹配所包含的任意一个字符。例如,"[abc]"可以匹配"plain"中的"a"

[^] 赋值字符集合,匹配未包含的一个任意字符。例如,"[^abc]"可以匹配"plin"中任何一个字母

[n1-n2] 字符范围,匹配指定范围内的任意一个字符。例如,"[a-z]"可以匹配"a"到"z"范围内的任意一个小写字母字符。注意:只有连字符(-)在字符组内部,并且出现在两个字符之间时,才能表示字符的范围;如果出现在字符组的开头,则只能表示连字符本身

(n}  n 是一个非负整数,匹配确定的n次。例如,"o(2}"不能匹配"Bob"中的"o",但是能匹配"food"中的"oo"{n, } n是一个非负整数,至少匹配n次。例如,"o({2,)"不能匹配"Bob"中的"o”,但能匹配""fooood"中的所有o。"o(1,)"等价于"o+"。“o(0,]"则等价于"o*”

{n, m} m和 n均为非负整数,其中 n<=m,最少匹配n次且最多匹配m 次

正则工具

Cut工具

 列截取工具,cut命令从文件的每一行剪切字节,字符和字段,并将这额字符,字节,字段挟制标准输出,如果不指定file参数,cut命令将读取标准输入,必须指定-b,-c或-f标志之一

选项:

-b:按宁节截取

-c:按字符截取,常用于中文

-d:指定以什么为分隔符截取,默认为制表符

-f:通常和-d一起

案例:

Cat /etc/passwd | cut -d ‘:’ -f 1,表示-d为以:为分隔符,取第一列

Cat /etc/passwd | cut -d ‘:’ -f 1,3表示以:为分隔符取第一列和第三列,不连续

Cat /etc/passwd | cut -d ‘:’ -f 1-3表示以:为分隔符,取一到三列,连续

ls | cut -b 3表示按字节截取

Ls | cut -c 2 上组代码中-d是以第几个字符来截取,而-c则是以中文字符截取

截取331081504806027044938:

Sort工具

  sort是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序,例如数据和字符的排序就不一样,用法:sort 【选项】 【参数】

常用选项:

-t:指定分隔符,默认使用「Tab]键或空格分隔-

-k:指定排序区域,哪个区间排序

-n :按照数字进行排序,默认是以文字形式排序

-u:等同于uniq,表示相同的数据仅显示一行,注意:如果行尾有空格去重就不成功

-r:反向排序,默认是升序,-r就是降序

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

案例:

Sort sort.txt 什么都不加的话即为默认按第一列升序,字母即从a到z由上

Sort -n -t: -k3 sort.txt 以冒号为分隔符,以数字大小对第三列排序

Sort -nr -t: -k3 passwd.txt 以冒号为分隔符,以数字大小对第三列排序(降序)

Sort -nr -t: -k3 sort.txt -o sort.sh排序后的结果不在屏幕上输出二十输出到sort.sh文件中。

Sort -u sort.txt 避免重复的内容(重复的行可以是不连续的)

Uniq工具

  主要用于去除连续的重复行

注意:是连续的行,所以通常和sort结合使用先排序使之变成连续的行在执行去重操作,否则不连续的重复行不能去重

语法:uniq 【选项】【参数】

常用选项:

-c:对重复的行进行计数;

-d:仅显示重复行;

-u:仅显示出现一次的行;

案例

awk ‘{print $1}‘ sort.sh | uniq -c 表示相同的字符连续出现的次数

awk ‘{print $1}‘ sort.sh | uniq -d表示只显示重复的内容

awk ‘{print $1}‘ sort.sh | uniq -u只显示只出现过一次的行

查看当前状态中是连接状态的网络信息

netstat -natpul | grep "ESTABLISHED" | awk '{print $6 " " $4}' | uniq -c

Tr工具

 它可以用一个字符来替换另一个字符,或者可以完全出去一些字符,也可以用来重复字符

语法:tr 【选项】 set1 【set2】

从标准输入中替换,缩减或删除字符,并将结果写道标准输出

常用选项:

-d 删除字符

-s 删除所有重复出现的字符,只保留一个

Cat sort.sh | tr -d “lnjnb”

Cat sort.sh | tr -s “x”

Sed工具

文本处理工具,读取文本内容,根据指定的条件进行处理,如删除、替换、添加等

可在无交互的情况下实现相当复杂的文本处理操作

被广泛应用于Shell脚本,以完成自动化处理任务

sed依赖于正则表达式

工作原理:

Sed命令格式

sed -e '编辑指令' 文件1 文件2 …

sed -n -e '编辑指令' 文件1 文件2 …

sed -i -e '编辑指令' 文件1 文件2

常用选项

-e 指定要执行的命令,只有一个编辑命令时可省略

-n 只输出处理后的行,读入时不显示

-i 直接编辑文件,而不输出结果

-f 用指定的脚本文件来处理输入的文本文件

本文链接:https://my.lmcjl.com/post/4215.html

展开阅读全文

4 评论

留下您的评论.