Linux shell脚本中正则

grepsedawk 使用建议
grep: 文本过滤工具,如果仅仅是将文本过滤下显示出来的话,建议使用grep。
sed:Stream EDitor,流编辑器,默认只处理模式空间,不处理原数据,如果处理的数据是针对行进行处理的,可以使用sed。
awk: 数据分析、处理工具,报告生成器,格式化以后显示。如果对处理的数据需要生成报告之类的信息,或者处理的数据是按列进行处理的,最好使用awk。
正则表达式
是什么:使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。
作用
从字符串中提取子串
查找、替换文本内容
验证数据的有效性
分类
基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx 简称 BREs)
扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称 EREs)
Perl 的正则表达式(Perl Regular Expression 又叫 Perl RegEx 简称 PREs)
grep/egrep命令使用正则表达式方式
grep命令
不跟任何参数,则表示使用 ”BREs“
跟 ”-E" 参数,则表示使用 “EREs“
跟 “-P" 参数,则表示使用 “PREs“
egrep命令
不跟任何参数,则表示要使用 “EREs”
跟 “-P" 参数,则表示要使用 “PREs"
请添加图片描述
位置匹配字符举例
\b匹配一个单词边界,是指单词和空格间的位置。
例:“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。

    echo "never verb" |xargs -n1 |grep "er\b"

请添加图片描述
请添加图片描述
请添加图片描述

^ 匹配字符串开头
例:匹配以abc开头的行:

     echo –e “abc\nxyz”|grep –E ^abc

请添加图片描述

$ 匹配字符串结尾

    例:匹配以xyz结尾的行echo –e “abc\nxyz”|grep –E xyz$

请添加图片描述

频率匹配字符

*    		0到无数次(通配符匹配所有)
+   		1到无数次(重复一个或者多个前一个字符)
? 		    0或者1 次(显示当前字符前边字符)
{n}  		重复N次
{n,} 		重复至少N次
{n,m}   	n到m次
[]  		字符组,字符范围
\           转义字符
|           或者。找出多个字符
()          查找组字符
()+        查找重复组字符

\ 转义字符案例
请添加图片描述
请添加图片描述
首先准备test.txt文件
在这里插入图片描述
案例1:匹配含有字符“sh”,后面紧跟着字符“i”或者“o”的文本行([] :匹配括号内字符)
在这里插入图片描述
案例2:筛选以字符串“ss”开头,后面至少紧跟着1个字符“s”的文本行
在这里插入图片描述
案例3:筛选以字符串“ss”开头,后面跟着0或者1个s的文本行
在这里插入图片描述
案例4:竖线“|” 表示多个正则表达式之间“或”的关系。圆括号“()”用来表示一组可选值的集合。竖线和圆括号经常在一起使用,表示一组可选值
筛选含有字符串“ssh”、“ssl”的文本行
在这里插入图片描述

频率匹配字符举例
例1:email地址的正则表达式可以写成

  /^[a-zA-Z0-9_]+@[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+$/

给定首先这个email的正则表达式中的3个中括号都表示是字符范围,
+号表示出现1次或者多次
例2:匹配腾讯QQ号:[1-9][0-9]{4,}
这里的{4,}就是指重复出现至少4次。
字符串匹配字符

.  		    除换行以外的其他任意字符
\s  		空白字符——[ \f\n\r\t\v]
\S   		除空白字符以外的任意字符—— [^ \f\n\r\t\v]
\w  		字母、数字、下划线——[A-Za-z0-9_]
\W  		除了字母、数字、下划线以外的任意字符—[^A-Za-z0-9_]
\d   		数字 0-9——[0-9] 得是 grep -P
\D  	    除了数字之外的任意字符——[^0-9]

字符串匹配字符举例
例1:email地址的正则表达式可以写成

/^\w+@\w+\.\w+$/

请添加图片描述

例2:匹配身份证
\d{15}|\d{18},中国的身份证为15位或18位,这里的\d就是数字的含义
请添加图片描述
请添加图片描述
请添加图片描述

grep
grep(截取) 文本搜集工具,使用正则表达式搜索文本,并把匹配的行打印出来。
主要参数:

-a: 以文本文件形式搜索  
-c : 计算输出匹配到的行数  count
-i : 不区分大小写   ignore
-h : 查询多文件时不显示文件名
-l : 查询多文件时, 只输出包含匹配字符的文件名
-n : 显示匹配的行号及行    line no
-o: 只显示匹配的内容    only matching   
-v : 显示不包含匹配文本的所有行    invert matching

请添加图片描述
补充:-m 数字N 最多匹配N个后停止
工作方式

grep ‘要匹配的内容’ 文件名

例如:
Ifconfig|grep –o inet //只显示匹配的字符串
seq 1 20 |grep –m 5 –E ‘[0-9]{2}’//输出匹配的前5个结果
seq 1 20 |grep –c –E ‘[0-9]{2}’//输出匹配的行数
egrep "^ftp|^mail" /etc/passwd //查找出以ftp或mail开头的行
grep bash$ /etc/passwd //查找出以bash结尾的行
补充
seq命令用于产生从某个数到另外一个数之间的所有整数。
语法:

seq [选项]... 尾数
seq [选项]... 首数 尾数
seq [选项]... 首数 增量 尾数

选项:

-f, --format=格式 使用printf 样式的浮点格式
-s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n)
-w, --equal-width 在列前添加0 使得宽度相同

-f选项:指定格式

[root@Gin scripts]# seq -f "%3g" 9 11
  9
 10
 11

%后面指定数字的位数 默认是%g,%3g那么数字位数不足部分是空格。

[root@Gin scripts]# seq -f "str%03g" 9 11
str009
str010
str011

这样的话数字位数不足部分是0,%前面制定字符串。
-w选项:指定输出数字同宽

[root@Gin scripts]# seq -w 98 101
098
099
100
101

不能和-f一起用,输出是同宽的。
-s选项:指定分隔符(默认是回车)

[root@Gin scripts]# seq -s" " -f"str%03g" 9 11
str009 str010 str011

指定/t做为分隔符号

[root@Gin scripts]# seq -s"`echo -e "/t"`" 9 11
9/t10/t11

指定 = 作为分隔符号:

[root@Gin scripts]# seq -s '=' 1 5
1=2=3=4=5

seq转载于https://www.cnblogs.com/ginvip/p/6351720.html
补充
补充

$、^*.[]、\w、\W是普通的正则表达式。我也不知道该怎么形容- -
{}+、?要加-E,扩展正则表达式

\d、\D要加-P,perl的正则表达式

-v 反向查找。排除匹配的内容
-i 忽略大小写
-w 显示全字符符合的行。如果grep ‘wu’ ,则wu是一个完整的单词
-x 显示全行符合的行。 如果grep ‘wu’,则一行的内容是wu
-E 默认命令只支持基本的正则表达式,该选项使grep命令支持扩展正则表达式
-n 显示符合行的行号
-一个数字 除了显示匹配的行之外,还显示该行上下制定的行数
-q 不显示任何信息 。在if判断里使用时很合适
-l 查询多文件时只输出包含匹配字符的文件名
-c 显示匹配行的计数,即一共有多少行
-h 查询多文件时不显示文件名字
常用例子:
grep -E ‘^\w{8,}’ 匹配以字母或者数字开头,最少出现八次的行。
grep -wE ‘^\w{8,}’ 匹配整个单词是字母或者数字开头,最少出现八次
grep -E [1-9][0-9]{4,} 匹配QQ号,5位QQ号起
grep -P ‘\d{3}-\d{8}’ 匹配电话号码
grep -P ‘\d+.\d+.\d+.\d’ 匹配IP地址
grep -wP ‘[1-9][0-9]{5,}*’ 匹配匹配最少6位的整数
grep 'w{0,3) ’ 匹配出现0-3个w的行。这是不加-E的用法也可以 grep -E ‘w{0,3}’。我也有点迷啊。看样子,基本的正则表达式需要加\才能用一些符号啊。
在网上找到了资料。关于正则表达式基本集和扩展集。谢谢哥们了,好东西啊。
grep正则表达式元字符集(基本集)

^ 锚定行的开始 如:’^grep’匹配所有以grep开头的行。
$ 锚定行的结束 如:'grep$'匹配所有以grep结尾的行。
. 匹配一个非换行符的字符 如:‘gr.p’匹配gr后接一个任意字符,然后p。
[] 匹配一个指定范围内的字符,如’[Gg]rep’匹配Grep和grep。

[^] 匹配一个不在指定范围内的字符,如:’[^A-FH-Z]rep’匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
.... 标记匹配字符,如’lovelove’,love被标记为1。
\< 锚定单词的开始,如:’<grep’匹配包含以grep开头的单词的行。
\> 锚定单词的结束,如’grep>'匹配包含以grep结尾的单词的行。
x\{m\} 重复字符x,m次,如:'0{5}'匹配包含5个o的行。
x\{m,\} 重复字符x,至少m次,如:'o{5,}'匹配至少有5个o的行。
x\{m,n\} 重复字符x,至少m次,不多于n次,如:'o{5,10}'匹配5–10个o的行。
\w 匹配文字和数字字符,也就是[A-Za-z0-9],如:‘G\w*p’匹配以G后跟零个或多个文字或数字字符,然后是p。
\W \w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b 单词锁定符,如: ‘\bgrep\b’只匹配grep。有点像< >
用于egrep和 grep-E的元字符扩展集
+ 匹配一个或多个先前的字符。如:’[a-z]+able’,匹配一个或多个小写字母后跟able的串,如loveable,enable,disable等。
? 匹配零个或多个先前的字符。如:'gr?p’匹配gr后跟一个或没有字符,然后是p的行。
a|b|c 匹配a或b或c。如:grep|sed匹配grep或sed
() 分组符号,如:love(able|rs)ov+匹配loveable或lovers,匹配一个或多个ov。
x{m},x{m,},x{m,n} 作用同x{m},x{m,},x{m,n}

POSIX字符类
为 了在不同国家的字符编码中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字符类,如[:alnum:]是A-Za-z0-9的另一个写法。要把它们放到[]号内才能成为正则表达式,如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符类。

[:alnum:]文字数字字符
[:alpha:]文字字符
[:digit:]数字字符
[:graph:]非空字符(非空格、控制字符)
[:lower:]小写字符
[:cntrl:]控制字符
[:print:]非空字符(包括空格)
[:punct:]标点符号
[:space:]所有空白字符(新行,空格,制表符)
[:upper:]大写字符
[:xdigit:]十六进制数字(0-9,a-f,A-F)

原文链接:https://blog.csdn.net/Shliesce/article/details/10494979

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值