shell 正则表达式详解
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
正则表达式
一什么是正则表达式
正则表达式是通过一些特殊字符的排列用以查找、替换、删除一行或多行文字字符串简单的说正则表达式就是用在字符串的处理上面的一项表示式。由于正则表达式语法简练功能强大得到了许多程序设计语言的支持包括Java、C++、Perl以及Shell等。
二为什么使用正则表达式
在进行程序设计的过程中用户会不可避免地遇到处理某些文本的情况。有的时候用户还需要查找符某些比较复杂规则的字符串。对于这些情况如果单纯依靠程序设计语言本身则往往会使得用户通过复杂的代码来实现。但是如果使用正则表达式则会以非常简短的代码来完成。
三如何使用正则表达式
当一个正则表达式完成之后并能够保证这个表达式一定是准确的需要不断地测试才可以确定其正确 与否。在不同的环境下用户需要不同的工具来帮助他完成测试的过程。如果是在Shell命令行中用户 可以使用grep命令来测试。
grep家族有三大成员分别为
grep支持使用基本正则表达式。
egrep支持使用扩展正则表达式。
fgrep不支持使用正则表达式即所有的正则表达式中的元字符都将作为一般字符仅仅拥有其字面 意义不再拥有特殊意义。
grep命令的名称来自于全局搜索正则表达式并打印文本行Global Search Regular Expression and Print out the line的缩写。它是一个非常古老的UNIX命令也是一种强大的文本搜索工具。grep命令 使用正则表达式来搜索文本并且把匹配的文本行打印出来。
grep命令根据用户指定的”pattern过滤条件“对目标文本逐行进行匹配检查打印出符合条件的 行即文本搜索工具。注PATTERN即过滤条件指由文本字符及正则表达式元字符所编写的字符串。
grep命令的基本语法如下grep [options] pattern [file…]
在上面的语法中options表示选项选项列表如下表。pattern表示要匹配的模式file表示一系列的文 件名。grep命令会从一个或者多个文件中搜索满足指定模式的文本行并且打印出来。模式后面的所有的字符串参数都被看作是文件名。
示例
1 -n : 显示行号
[root@wangjingjing ~]# ls -l | grep -n num
21:-rw-r--r--. 1 root root 222 Feb 1 17:53 num_script.sh
2 -o : 只显示匹配的内容
[root@wangjingjing ~]# ls -l | grep -o num
num
3 -q : 静默模式没有任何输出得用$?来判断执行成功没有即有没有过滤到想要的内容
[root@wangjingjing ~]# ls -l | grep -q num
[root@wangjingjing ~]# echo $?
0
4 -A : 如果匹配成功则将匹配行及其后n行一起打印出来
[root@wangjingjing ~]# ls -l | grep num -A 2
-rw-r--r--. 1 root root 222 Feb 1 17:53 num_script.sh
drwxr-xr-x. 2 root root 6 Dec 31 19:16 Pictures
drwxr-xr-x. 2 root root 6 Dec 31 19:16 Public
5 -B : 如果匹配成功则将匹配行及其前n行一起打印出来
[root@wangjingjing ~]# ls -l | grep num -B 2
-rw-r--r--. 1 root root 0 Jan 30 11:37 newfile
-rw-r--r--. 1 root root 171 Jan 30 21:55 newfile.sh
-rw-r--r--. 1 root root 222 Feb 1 17:53 num_script.sh
6 -C : 如果匹配成功则将匹配行及其前后n行一起打印出来
[root@wangjingjing ~]# ls -l | grep num -C 2
-rw-r--r--. 1 root root 0 Jan 30 11:37 newfile
-rw-r--r--. 1 root root 171 Jan 30 21:55 newfile.sh
-rw-r--r--. 1 root root 222 Feb 1 17:53 num_script.sh
drwxr-xr-x. 2 root root 6 Dec 31 19:16 Pictures
drwxr-xr-x. 2 root root 6 Dec 31 19:16 Public
7 -c :如果匹配成功则将匹配到的行数打印出来 统计行数
[root@wangjingjing ~]# ls -l | grep -c num
1
--color: 高亮颜色显示匹配到的字符串
--color=never没有颜色
--color=always
--color=auto自动的颜色
-E: 支持扩展中的表达式
-e:支持基本的正则表达式
-P: 对Perl的正则表达式的支持
8 -o:只输出匹配到的内容
[root@wangjingjing ~]# ls -l | grep function
-rw-r--r--. 1 root root 682 Feb 3 12:07 function_script.sh
[root@wangjingjing ~]# ls -l | grep -o function
function
9 -v :取反不匹配
[root@wangjingjing ~]# ls -l | grep -v function
total 72
-rw-r--r--. 1 root root 331 Feb 1 20:22 99table_script.sh
-rw-------. 1 root root 1272 Dec 31 19:14 anaconda-ks.cfg
-rw-r--r--. 1 root root 215 Jan 31 15:27 arg_script.sh
-rw-r--r--. 1 root root 332 Jan 31 15:28 args_script.sh
drwxr-xr-x. 2 root root 36 Jan 1 11:00 at230101
drwxr-xr-x. 2 root root 116 Jan 8 18:15 ca_learning
10 -w匹配单词
[root@wangjingjing 0202]# grep -w hello file.txt
hello
hello world
四基本正则表达式
基本正则表达式Basic Regular ExpressionBRE又称为标准正则表达式是最早制订的正则表达 式规范仅支持最基本的元字符集。基本正则表达式是POSIX规范制订的两种正则表达式语法标准之 一另外一种语法标准称为扩展正则表达式。
基本正则表达式示例
1 ^ 在每行的开始进行匹配
匹配以123为开头的
[root@wangjingjing ~]# echo "123 456 789" | grep ^123
123 456 789
[root@wangjingjing ~]# echo "123 456 789" | grep ^456
[root@wangjingjing ~]#
2 $ 在每行的末尾进行匹配
匹配以789结尾的
[root@wangjingjing ~]# echo "123 456 789" | grep 789$
123 456 789
[root@wangjingjing ~]# echo "123 456 789" | grep 456$
[root@wangjingjing ~]#
3 . 对任何单个字符进行匹配
匹配ab后面连着任意一个字符
[root@wangjingjing 0202]# echo "abcdabef" | grep ab.
abcdabef
匹配ab后面连着任意2个字符
[root@wangjingjing ~]# echo "abcdabcdabcd" | grep a..
abcdabcdabcd
4 *量词 对前一项进行0次或多次重复匹配
尽可能多的去匹配成功的前提下
多次a
[root@wangjingjing ~]# echo "aaabbbccc" | grep "a*"
Aaabbbccc
0次a
[root@wangjingjing ~]# echo "bbbccc" | grep "a*"
bbbccc
5 [str] 对str中的任何单个字符进行匹配
6 [a-b] 对a到b之间的任何字符进行匹配
[root@wangjingjing ~]# echo "a" | grep [a-z]
a
[root@wangjingjing ~]# echo "7" | grep [0-9]
7
[root@wangjingjing ~]# echo "m" | grep [a-z]
m
7 [^str] 对任何不在str中的单个字符进行匹配
匹配abc的补集
[root@wangjingjing 0202]# echo "a" | grep [^abc]
[root@wangjingjing 0202]# echo "m" | grep [^abc]
m
8 \ 忽略后面一个字符的特殊含义
取消.的特殊意义
[root@wangjingjing ~]# echo "3a14" | grep "^3.14"
3a14
[root@wangjingjing ~]# echo "3a14" | grep "^3\.14"
[root@wangjingjing ~]#
注意grep要将{}转义\{\},egrep不需要转义
9 a{n}: a重复指定的次数
[root@wangjingjing 0202]# echo "aaaaaaaa" | grep 'a\{5\}'
aaaaaaaa
[root@wangjingjing 0202]# echo "aaaaaaaa" | egrep 'a{5}'
aaaaaaaa
10 a{n,m}: 重复n-m次(贪婪的)
对a第一次匹配重复5次第二次匹配三次
[root@wangjingjing 0202]# echo "aaaaaaaa" | grep 'a\{2,5\}'
aaaaaaaa
11 a{n,}: 最少重复n次最多没有限制
贪婪的重复最多次
[root@wangjingjing 0202]# echo "aaaaa" | grep 'a\{2,\}'
aaaaa
12 a{,m}最多重复m次最少没有限制
[root@wangjingjing 0202]# echo "aaaaa" | grep 'a\{,2\}'
aaaaa
13 \(\)定义子表达式的开始和结束位置。
匹配abcd
[root@wangjingjing 0202]# echo "abcdefbcdcdd" | grep 'a\(b\(c\(d\)\)\)'
abcdefbcdcdd
匹配abcdef,组1
[root@wangjingjing 0202]# echo "abcdefbcdcdd" | grep 'a\(b\(c\(d\)\)\)ef\1'
abcdefbcdcdd
匹配abcdefbcd(组1)cd组2
[root@wangjingjing 0202]# echo "abcdefbcdcdd" | grep 'a\(b\(c\(d\)\)\)ef\1\2'
abcdefbcdcdd
14 \或\b:锚定词尾(支持vi和grep)其前面的任意字符必须作为单词尾部出现
只匹配单词的首尾不包括特殊符号除了. ?
[root@wangjingjing 0202]# echo "hello" | grep '\bhello\b'
hello
[root@wangjingjing 0202]# echo "helloo" | grep '\bhello.\b'
helloo
贪婪尽可能多的去匹配大前提匹配成功
a*: 0-任意多
a?0-1
a+1-任意
a{n,m}: n-m
正则表达式字符集
正则表达式字符集示例
1 [[:alnum:]] 匹配任意一个字母或者数字等价于[A-Za-z0-9]
[root@wangjingjing 0202]# echo "hello123" | grep '[[:alnum:]]*'
hello123
[root@wangjingjing 0202]# echo "hello123" | grep '[a-zA-Z0-9]*'
hello123
2 [[:alpha:]] 匹配任意一个字母等价于[A-Za-z]
[root@wangjingjing 0202]# echo "hello123" | grep '[[:alpha:]]*'
hello123
[root@wangjingjing 0202]# echo "hello123" | grep '[a-zA-Z]*'
hello123
3 [[:digit:]] 匹配任意一个数字等价于[0-9]
[root@wangjingjing 0202]# echo "hello123" | grep '[[:digit:]]*'
hello123
[root@wangjingjing 0202]# echo "hello123" | grep '[0-9]]*'
hello123
4 [[:lower:]] 匹配任意一个小写字母等价于[a-z]
[root@wangjingjing 0202]# echo "Hello123" | grep '[[:lower:]]*'
Hello123
[root@wangjingjing 0202]# echo "Hello123" | grep '[a-z]*'
Hello123
5 [[:upper:]] 匹配任意一个大写字母等价于[A-Z]
[root@wangjingjing 0202]# echo "Hello123" | grep '[[:upper:]]*'
Hello123
[root@wangjingjing 0202]# echo "Hello123" | grep '[A-Z]*'
Hello123
6 [[:space:]] 匹配任意一个空白符包括空格、制表符、换行符以及分页符
空格
[root@wangjingjing 0202]# echo "Hello 123" | grep '[[:space:]]*'
Hello 123
制表符占8位
[root@wangjingjing 0202]# echo -e "Hello\t\t\t123" | grep '[[:space:]]*'
Hello 123
换行符grep -z 选线
[root@wangjingjing 0202]# echo -e "Hello\n\n123" | grep -z '[[:space:]]*'
Hello
123
五扩展正则表达式
扩展正则表达式Extended Regular ExpressionERE支持比基本正则表达式更多的元字符但是扩展正则表达式对有些基本正则表达式所支持的元字符并不支持。前面介绍的元字符“^”、“$”、“.”、“*”、 “[]”以及“[^]”这6个元字符在扩展正则表达式都得到了支持并且其意义和用法都完全相同不再重复介绍。接下来重点介绍一下在扩展正则表达式中新增加的一些元字符。
扩展正则表达式示例
1+ 对前一项进行1次或多次重复匹配
[root@wangjingjing 0202]# echo "sssssss" | grep -E 's+'
sssssss
2 对前一项进行0次或1次重复匹配
[root@wangjingjing 0202]# echo "sssssss" | grep -E 's?'
sssssss
3 匹配单独的a
[root@wangjingjing 0202]# echo "sssssss" | grep -E 's*?'
sssssss
非贪婪尽可能少的去匹配
a*?
a+?
a??
a{n,m}?
扩展
1 (?:)分组的非捕获版本
加了的不参与分组
[root@wangjingjing 0202]# echo "abcdefgbcd" | grep -Po 'a(?:b(c(d)))efg\1'
加了的不参与分组组名顺延
[root@wangjingjing 0202]# echo "abcdefgcd" | grep -Po 'a(?:b(c(d)))efg\1'
abcdefgcd
2 给分组命名 ?p<组名> ?p=组名
[root@wangjingjing 0202]# echo "abcdefgbcd" | grep -Po 'a(?P<g1>b(c(d)))efg(?P=g1)'
abcdefgbcd
3 ?#注释里面的内容不参与匹配
[root@wangjingjing 0202]# echo "abcdefgbcd" | grep -Po 'a(?#express)(b(c(d)))efg\1'
abcdefgbcd
4?=: 不消耗样式 lookahead assertion: 前视断言他是一个判定条件但是不作为结果范围也不消耗内容
去匹配要获取的是windows但是只能是windows10的时候获取windows
[root@wangjingjing 0202]# echo "windows10" | grep -Po "windows(?=10)"
windows
[root@wangjingjing 0202]# echo "windows10" | grep -Po "windows(?=10)10"
windows10
[root@wangjingjing 0202]# echo "windows98" | grep -Po "windows(?=10)"
[root@wangjingjing 0202]#
5 (?!…) negative lookahead assertion 前视预断言取反
去匹配要获取的是windows但是只能不是windows10的时候获取windows
[root@wangjingjing 0202]# echo "windows10" | grep -Po 'windows(?!10)'
[root@wangjingjing 0202]# echo "windows98" | grep -Po 'windows(?!10)'
windows
[root@wangjingjing 0202]# echo "windows98" | grep -Po 'windows(?!10)98'
windows98
6 (?<=…): positive lookbehind assertion: 后视断言
只有windows前边是10的时候才匹配成功也是返回windows
ot@wangjingjing 0202]# echo "10windows" | grep -Po '(?<=10)windows'
windows
[root@wangjingjing 0202]# echo "10windows" | grep -Po '10(?<=10)windows'
10windows
[root@wangjingjing 0202]# echo "10windows" | grep -Po '98(?<=10)windows'
[root@wangjingjing 0202]#
7 (?<…): positive lookbehind assertion: 后视断言取反
只有windows前边不是10的时候才匹配成功也是返回windows
[root@wangjingjing 0202]# echo "10windows" | grep -Po '(?<!10)windows'
[root@wangjingjing 0202]# echo "10windows" | grep -Po '10(?<!10)windows'
[root@wangjingjing 0202]# echo "98windows" | grep -Po '(?<!10)windows'
windows
[root@wangjingjing 0202]# echo "98windows" | grep -Po '98(?<!10)windows'
98windows
8 A|B 匹配A或者BA和B都是正则表达式
[root@wangjingjing 0202]# egrep "^h|o$" file.txt
hello
hi
hello world