转自:https://www.jb51.net/article/54961.htmlinux
最近一直在研究shell脚本这块,恰好闲下来整了下本身手头上比较好的资料中的一些范例,如下是我整理的鸟哥私房菜里面正则表达式里面比较基础的一些语法详解,适合新手查阅。git
首先先复制一段范例:正则表达式
设置语系为Cshell
grepexpress
1.搜寻特定字符串"the"
注: n为显示行号数组
2.反向搜寻特定字符串"the"app
3.取得任意大小写"the"的这个字符串tcp
4.利用括号 [] 来搜寻集合字符
搜索test或taste这两个单词时,发现他们有共同的't?st',因此能够这么搜寻this
这样其实就是在找t[a]st和t[e]st这两个分开的字符
若是搜索有 oo 的字符时,则可使用:google
若是搜索oo时不想搜到 oo 前面有 g 的话,咱们能够利用反向选择[^]来达成:
若是搜索oo前面不想有小写字符,则:
注: 大写英文/小写英文/数字 可使用 [a-z]/[A-Z]/[0-9]等方式来书写,也能够写在一块儿
[a-zA-Z0-9]表示要求字符串是数字以及英文
若是咱们要取得有数字的那行,则:
注:但考虑到语系对编码顺序的影响,所以除了连续编码使用减号[-]外,也能够用[:lower:]代替a-z 以及 [:digit:] 代替0-9 使用
5.显示行首为'the'的字符串
显示行首是小写字符
6.显示行尾为点 . 的那一行
7.显示5-9行数据
8.显示空白行
9.找出g??d字符串,起头g结束d的四个字符串
10. o*表明空字符(就是有没有字符均可以)或者一个到N个o字符,因此grep -n 'o*' regular_express.txt就会把全部行所有打印出来,
11.oo*表明o+空字符或者一个到N个o字符,因此grep -n 'oo*' regular_express.txt就会把o,oo,ooo等的行所有打印出来
12."goo*g"表明gog,goog,gooog...等
13.找出含g...g字符串的行
注: .表明任意字符, .*则就表明空字符或者一个到N个任意字符
14.找出含有数字的行
或# grep -n '[0-9]' regular_express.txt
15.找出含两个o的字符串
注:{}由于在shell里有特殊意义,因此须要加跳脱符\来让其失去意义
找出g后含2到5个o而后以g结尾的字符串
找出g后含2以上的o而后以g结尾的字符串
总结:
^word 表示带搜寻的字符串(word)在行首
word$ 表示带搜寻的字符串(word)在行尾
. 表示1个任意字符
\ 表示转义字符,在特殊字符前加\会将本来的特殊字符意义去除
* 表示重复0到无穷多个前一个RE(正则表达式)字符
[list] 表示搜索含有list的字符串
[n1-n2] 表示搜索指定的字符串范围,例如[0-9] [a-z] [A-Z]等
[^list] 表示反向字符串的范围,例如[0-9]表示非数字字符,[A-Z]表示非大写字符范围
\{n,m\} 表示找出n到m个前一个RE字符
\{n,\} 表示n个以上的前一个RE字符
egrep总结:
+ 表示重复一个或一个以上的前一个RE字符
范例:egrep 'go+d' regular_express.txt
表示搜寻(god)(good)(goood)...等等字符串,o+表明[一个以上的o]
? 表示重复零个或一个的前一个RE字符
范例:egrep 'go?d' regular_express.txt
表示搜寻(gd)(god)字符串,o?表明[空的或1个o]
注:egrep下'go+d'和'go?d'的结果集合就等于grep下的'go*d'
| 表示用或(or)的方式找出数个字符串
范例:egrep 'gd|good|dog' regular_express.txt
表示搜寻(gd)或(god)或(god)字符串,|表明或
() 表示找出群组字符串
范例:egrep 'g(la|oo)d' regular_express.txt
表示搜寻(glad)或(good)字符串
() +表示找出多个重复群组的判别
范例: echo 'AxyzxyzxyzxyzxyzC'|egrep 'A(xyz)+C'
表示搜寻开头是A结尾是C,中间有一个以上的'xyz'字符串
sed:
插入:
1.将/etc/passwd 的内容列出并打印行号,同时,将2-5行删除显示
注: sed是sed -e的简写, 后接单引号
同上删除第2行
同上删除第三行到最后一行
2.在第二行后加上一行test
在第二行前加上一行test
在第二行后加入两行test
替换行:
3.将2-5行内容取代为 No 2-5 number
4 列出/etc/passwd 内第5-7行
替换字符串:
sed 's/被替换字符串/新字符串/g'
1.获取本机IP的行
将IP前面的部分予以删除
将IP后面的部分删除
2.用grep将关键词MAN所在行取出来
删除批注行
删除空白行
3.利用sed将regular_express.txt内每一行若为.的换成!
注:-i参数会直接修改文本,而并不是直接输出
4.利用sed在文本最后一行加入 #This is a test
注: $表明最后一行 a表明行后添加
将selinux配置文件enforcing改为disabled
延伸正规表示法:
延伸写法:
1. +表示重复一个或一个以上的前一个RE字符
例如:egrep -n 'go+d' regular_express.txt
普通写法: grep -n 'goo*d' regular_express.txt
2. ?表示重复零个或一个前一个RE字符
例如: egrep -n 'go?d' regular_express.txt
3. |表示用或的方式找出数个字符串
例如: egrep -n 'gd|good' regular_express.txt
4. ()表示找出群组字符串
例如: egrep -n 'g(la|oo)d' regular_express.txt
也就是搜寻(glad)或good这两个字符串
5. ()+多个重复群组判别
例如: echo 'AxyzxyzxyzxyzC'|egrep 'A(xyz)+C'
也就是要找开头是A结尾是C 中间有一个以上的'xyz'字符串的意思
awk:
1.用last取出登录数据前五行
取出帐号与登录者IP,且帐号与IP之间以TAB隔开
注:$1表明用空格或TAB隔开的第一个字段,以此类推。。
$0表明该行所有字段
注: NF表明每一行的$0的字段总数
NR表明目前awk所处的是第几行数据
FS表明目标分隔符,默认为空格
2.在/etc/passwd中以:来做为分段字符,则咱们要查阅第三栏小于10如下的数据,并只列出帐号与第三栏
注:查询结果未显示第一行数据,是由于咱们虽然定义了FS=":" 但却只能在第二行生效
想读取第一行就须要BEGIN这个关键词:
df:
比较两个文件的差别:
实例:
1。统计TCP链接状态
过滤出以tcp开头的行,“^”为正则表达式用法,以...开头,这里是过滤出以tcp开头的行。S[]定义了一个名叫S的数组,在awk中,数组下标一般从 1 开始,而不是 0。NF当前记录里域个数,默认以空格分隔,如上所示的记录,NF域个数等于$NF表示一行的最后一个域的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是SYN_RECV或TIME_WAIT等。S[$NF]表示数组元素的值,如上所示的记录,就是S[TIME_WAIT]状态的链接数++S[$NF]表示把某个数加一,如上所示的记录,就是把S[TIME_WAIT]状态的链接数加一结果就是显示S数组中最终的数组值例:S[TIME_WAIT]=最终值 S[TESTABLISHED]=最终值ENDfor(key in S)遍历S[]数组print key,”\t”,S[key]打印数组的键和值,中间用\t制表符分割,显示好一些。