12.Shell之正则表达式+总结+案例

小破站学习笔记

正则表达式是什么

字符模式 缩写RE
用于查找过程中匹配指定字符
许多程序设计语言都支持正则表达式进行字符串操作
正则表达式概念最初由Unix中的工具软件普及开的,如sed grep
支持正则表达式的程序如:locate find vim grep sed awk

正则可以干什么

匹配邮箱 匹配身份证号码 手机号 银行卡
匹配某些特定字符串 做特定处理

正则中的名词解释

  • 元字符
    指那些正则表达式中具有特俗意义的专用字符 如点. 星* 问号? 等
  • 前导字符

位于元字符前面的一个字符 abc* aoo.

第一类正则表达式

  • 普通常用元字符
.	匹配除了换行符以外的任意单个字符
*	前导字符出现0次或者连续多次
.*	任意长度字符
^	行首 以..开头
$	行尾 以..结尾
^$	空行
[]	匹配括号里任意单个字符或一组单个字符	
[^]	匹配不包含括号内任一单个字符或者一组单个字符
^[]	匹配以括号里任意单个字符或一组单个字符开头
^[^]	匹配不以括号里任意单个字符或一组单个字符开头
################################################
grep 'g.' 1.txt
匹配包含g和后所跟任意单个字符的行 (grep 行过滤)
grep 'go*' 1.txt
匹配g和o0个或多个的行
grep 'go.*' 1.txt
匹配go和后面任意长度字符的行
grep '^gel' 1.txt
匹配以gel开头的行
grep 'abc$' 1.txt
匹配以abc结尾的行
grep '^[abc]' 1.txt
匹配以a或b或c开头的
grep '^[abc]' 1.txt
匹配不以a或b或c开头的
  • 其他常用元字符
\<	取单词的头
\>	取单词的尾
\<\>	精确匹配
\{n\}	匹配前导字符连续出现n次
\{n,\}	匹配前导字符至少出现n次
\{n,m\}	匹配前导字符出现n次与m次之间
\(\)	保存被匹配的字符
\d	匹配数字 grep -P  要加P		[0-9]
\w	匹配字母数字下划线 grep -P 要加P		[a-zA-Z0-9_]
\s	匹配空格 制表符 换页符 grep -P 要加P		[\t\r\n]
##############################################
grep '\ 1.txt
匹配里面单词以hel为头
grep 'rld\>' 1.txt
匹配里面单词以rld为尾
#匹配内容里单词的头或尾 不是单词不匹配
grep '\' 1.txt
精确匹配hello这个单词 注意是单词
grep -w hello 1.txt 和这个精确匹配差不多
grep 'go\{2\}' 1.txt
匹配g和前导字符o连续出现2次的
grep 'go\{2,\}' 1.txt
匹配g和前导字符o至少出现2次
grep 'go\{2,4\}' 1.txt
匹配g和前导字符o出现2-4次
grep '[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{1\}\.[0-9]\{1\}' 1.txt
匹配ip 192.168.0.1 [0-9]表示数字 3 3 1 1 出现次数 \. 转义.
vim
:%S/10.10.1.1/10.10.1.2/g
:%s/\(10.10.1\).1/\1.254/g

:%s/helloworld yourself/hiworld myself/g
:%s/hello\(world \)your\(self\)/hi\1my\2/g
只替换掉不同的部分

  • 扩展类正则常用字符
    比较特殊 比如
    grep 要用到 要加-E 或者用egrep
    sed 要用的话 必须加-r
+	匹配一个或多个前导字符	grep -E bo+ 匹配boo,bo
?	匹配零个或一个前导字符	grep -E bo? 匹配b,bo
|grep -E a|b
()	组字符 看成整体 grep -E (my|your)self 匹配myself或yourself
{n}	前导字符重复n次
{n,}	前导字符重复至少n次
{n,m}	前导字符重复n到m次

第二类正则

[:alnum:]	字母与数字字符		[[:alunm:]]+
[:alpha:]	字符字符(包括大小写)		[[:alpha:]]{4}
[:blank:]	空格与制表符	[[:blank:]]*
[:digit:]	数字		[[:digit:]]?
[:lower:]	小写字母		[[:lower:]]{4,}
[:upper:]	大写字母		[[:upper:]]+  [A-Z]
[:punct:]	标点符号		[[:punct:]]
[:space:]	包括换行符,回车在内的所有空白		[[:space:]]+
grep -E [[:alunm:]]+

正则表达式总结

  • 1.我要找什么
找数字	[0-9]
找字母	[a-zA-Z]
找标点符号	[[:punct:]]
  • 2.我要如何找
以什么为首		^key
以什么为结尾		key$
包含什么或者不包含什么		[abc] ^[abc][^abc]^[^abc]
  • 3.我要找多少
找前导字符出现0次或连续多次		ab*
找任意单个字符		ab.
找任意字符		ab.*
找前导字符连续出现几次		{n} {n,} {n,m}
找前导字符出现1次或者多次	 go+
1.1.1.1
[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}
([0-9]{1,3}\.){3}[0-9]{1,3}
\d+\.\d+\.\d+\.\d+
(\d+\.){3}\d+

案例

1.查找不以大写字母开头的行
grep '^[^A-Z]'
grep -v '^[A-Z]'
grep '^[^[:upper:]]'
2.查找所有数字的行
grep [0-9]
grep -P '\d'
3.查找一个数字和在一个字母连起来
grep -E '[0-9][a-zA-Z]|[a-zA-Z][0-9]'
4.查找不以r开头的行
grep -v '^r'
5.查找以数字开头的行
grep '^[0-9]'
6.查找以大写字母开头的
grep '^[A-Z]'
7.查找以小写字母开头的
grep '^[a-z]'
8.查找以点结束的
grep '\.$'
9.去掉空行
grep -v '^$'
10.查找完全匹配abc的行
grep '\'
grep -w 'abc'
11.查找A后面有3个数字的行
grep 'A[0-9]{3}'
12.统计root在/etc/passwd出现几次 -o 只显示匹配项
grep -o 'root' /etc/passwd | wc -l
13.用正则找出自己的ip地址 广播地址 子网掩码
ifconfig|grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}'
14.找出文件中的ip地址并且打印替换为172.16.2.254
grep -o -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 1.txt | sed -n 's/192.168.0.\(254\)/172.16.2.\1/p'
15.找出文件中的ip地址
grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' 1.txt
16.找出全部是数字的行
grep -E '^[0-9]+$'
17.找出邮箱地址
grep -E '^[0-9a-zA-Z]+@[a-z0-9]+\.[a-z]+$'

你可能感兴趣的:(Shell)