linux基础之正则表达式

正则

正则表达式

作用:用来进行行文本匹配的工具[grep、sed、awk、vim、less、nginx、varnaish]
基本正则匹配选项必须用”“起来:
  • <^> 匹配字符串的开始
  • <$> 匹配字符串的结束。
  • <.>匹配除了换行符任意字符
  • <+> 匹配重复1次或更多次
  • <?>重复0次或1次
  • {n} 重复n次
  • {n,} 重复n次或更多次
  • {n,m} 重复n到m次
  • \<或者\b 词首锚定 >或者\b词尾锚定
  • (xxx) 分组:将一个或多个字符绑定在一起进行处理注意匹配到的(内容而非正则本身)会被正则表达式引擎记录与内部变量中,可被后续调用\1,\2
  • | 或者:a|b a或b
  • [:alnum:] 字母和数字
  • [:alpha:] 任何大小写字符A-Z a-z
  • [:digit:] 十进制数[:xdigit:] 十六进制
  • [:lower:] 小写字母 [:upper:] 大写字母
  • [:blank:] 空白字符(空格和制表符)
  • [:space:] 水平和垂直的空白字符
  • [:punct:] 标点符号
  • [任意要匹配的字符] 会递归取出
注意:通配符不支持[:xxx:]这种格式
扩展正则:匹配选项必须用”“起来
  • <\b>单词的开头或结尾,单词的分界处。举例:hi后面跟着lucy,\bhi\b.*\blucy\b \bx{n次}\b
  • <*>匹配任意次0次或多次,前面的内容可以连续重复使用任意次以使整个表达式得到匹配
  • <\d>匹配一位数字,为了避免重复可以使用\d{n}必须连续重复n次–只有python正则支持
  • <\w> 匹配字母或数字或下划线或汉字。
  • <\s> 匹配任意的空白符-
  • <^> 匹配字符串的开始
  • <$> 匹配字符串的结束。
  • <.>匹配除了换行符任意字符
  • <+> 匹配重复1次或更多次
  • <?>重复0次或1次
  • {n} 重复n次
  • {n,} 重复n次或更多次
  • {n,m} 重复n到m次
  • [任意要匹配的字符] 会递归取出
注意:与基本正则基本相同,只不过一些特殊符号不用再使\进行转义,当然有些特例:单词锚定和分组的后向引用仍需要\b \< \1.

举例&作业:
Windows\d+匹配Windows后面跟1个或更多数字
匹配电话号码:虽然可以匹配到,但是有一部分不是我们想要的结果所以可以用下面的分支条件来解决
[root@station88 src]# egrep ‘\(?[0-9]{3}[)-]?[0-9]{8}’ test.txt
233-39432434
(010)66513114
022-22333434
010)12345678
(022-66513115
作业:
1、显示三个用户root、mage、wang的UID和默认shell
[root@localhost lee]# cut -d: -f1,3,7 –output-delimiter = /etc/passwd|egrep “root|mage|wang”
root=0=/bin/bash
mage=515=/bin/bash
wang=516=/sbin/nologin
2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包 括下划线)后面跟一个小括号的行
[root@localhost lee]# egrep “^[[:alpha:]].*[[:punct:]]*\(\)” /etc/rc.d/init.d/functions
fstab_decode_str() {
checkpid() {
daemon() {
killproc() {
pidfileofproc() {
pidofproc() {
status() {
echo_success() {
echo_failure() {
echo_passed() {….
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
[root@localhost lee]# echo /etc/rc.d/init.d/functions |egrep -o “\b[[:alpha:]]*\b$”
functions
4、使用egrep取出上面路径的目录名
[root@localhost lee]# echo /etc/rc.d/init.d/functions |egrep -o “([[:punct:]]).*\1”
/etc/rc.d/init.d/
5、统计last命令中以root登录的每个主机IP地址登录次数
[root@localhost lee]# last |grep “root” |tr -s ” “|cut -d\ -f1,3 |sort |uniq -c|sort -nr
26 root 192.168.162.1
4 root :0.0
3 root pxe31.magelinux.
2 root pxe73.magelinux.
2 root :0
1 root 172.16.253.31
1 root 172.16.252.41
1 root 172.16.252.1
6、利用扩展正则表达式分别表示0-9、10-99、100-199、 200-249、250-255
#echo {1..255} > 1.txt
#egrep -o “\b[0-9]\b” 1.txt
#egrep -o “\b[0-9]{2}\b” 1
#egrep -o “\b[0-9]{2}\b” 1 |less
#egrep -o “\b1[0-9]{2}\b” 1 |less
#egrep -o “\b2[0-4][0-9]\b” 1 |less
#egrep -o “\b25[0-5]\b” 1 |less
7、显示ifconfig命令结果中所有IPv4地址
8、将此字符串:welcome to magedu linux 中的每个字符 去重并排序,重复次数多的排到前面
[root@localhost lee]# echo “welcome to magedu linux”|egrep -o “[[:alpha:]]”|sort|uniq -c|sort -nr
3 e
2 u
2 o
2 m
2 l
1 x
1 w
1 t
1 n
1 i
1 g
1 d
1 c
1 a
分支条件:
如果满足其中任意一种规则都应当成功匹配,使用方法用|把不同的规则分隔开。
[root@station88 src]# egrep ‘\([0-9]{3}\)[0-9]{8}|^[0-9]{3}-[0-9]{8}’ test.txt
233-39432434
(010)66513114
022-22333434
分组:过滤ip地址(搞定部分)
ifconfig eth0|egrep -o “([0-1][0-9][0-9]|2[0-5][0-4])\.([0-1][0-9][0-9]|2[0-5][0-4])\.([0-1][0-9][0-9]|2[0-5][0-4])\.([0-1][0-9][0-9]|2[0-5][0-4])”(分组引用为匹配结果的引用而非规则本身)
简化:ifconfig eth0|egrep -o “([0-1][0-9][0-9].|2[0-5][0-4].){3}[0-1][0-9][0-9]|2[0-5][0-4]”
反义:
* \W匹配任意不是字母数字下划线汉字的字符。
* \S匹配任意不是空白符的字符
* \D匹配任意非数字的字符
* \B匹配不是单词开头或结束的位置
* [^x]匹配除了x以外的任意字符
* [^aeiou]匹配除了aeiou这几个字母以外的任意字符。
* 举例:
* [root@station88 src]# egrep ‘^[^0-9].*[^0-9]$’ test.txt
* h,hihihihihiLucy
* iiiiiii
向后引用:
* 使用()指定一个分组后,默认分组会自动拥有一个组号,1….
* 向后引用用于重复搜索前面某个分组匹配的文本。\1匹配分组1
* 例如:\b(w+)\b\s+\1\b 可匹配重复的单词go go go
* 也可以指定表达式的组名。(?<world>\w+)=(?’world’\w+),将祖名指定为world–实验失败
断言:
* 概念:像\b,^,$这样用于指定一个位置,这个位置满足一定过的条件。

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/86949

(5)
Thunk_LeeThunk_Lee
上一篇 2017-09-11 18:16
下一篇 2017-09-11 21:04

相关推荐

  • 文件通配符是啥?

    文件通配符     包含 ‘?’, ‘*’ 或 ‘[‘ 字符的字符串称为通配符模板(wildcard  pattern).形成路径名(globbing)指一种操作,把通配符模板展开为匹配该串的路径名.匹配定义为:   …

    Linux干货 2017-04-23
  • Shell脚本编程之入门基础(一)

    Shell脚本编程   一、本章节一内容:    编程基础    脚本基本格式    变量    运算    条件测试   在本章节开始之前,我们先回顾下前面的知识点内容。前面学习了Linux的基础入门,了解到计算机是运行二进制指令的,而我…

    Linux干货 2016-08-12
  • N26-第五周

    1、显示当前系统上root、fedora或user1用户的默认shell; [root@localhost test]# cat /etc/passwd | grep -E “^(root|fedora|user1)\>” |cut -d: -f  1,7 root:/bin/bash user1:/bin/bash …

    Linux干货 2017-02-26
  • 20160801作业-用户和组

    http://note.youdao.com/yws/public/redirect/share?id=ba6a68550cd5c0ba5fd1cbfb66651916&type=false

    Linux干货 2016-08-08
  • bash脚本编程实例

    bash脚本编程实例 1.写一个脚本,判断当前系统上所有用户的shell是否为可登录的shell(即用户的shell不是/sbin/nologin),分别统计这两类用户的个数(通过字符串比较来实现) #!/bin/bash cat /etc/passwd|awk -F: ‘BEGIN{nologin=0;login=0}{if($NF==”/sbin/nol…

    Linux干货 2017-08-28
  • 文件共享服务之SAMBA

    文件共享服务之SAMBA 文件共享服务之SAMBA 一、samba出现的意义 二、samba协议描述 三、samba为客户端的实现 四、samba为服务端的实现 五、使用图形界面配置SAMBA 一、samba出现的意义 首先nfs实现系统文件挂载linux与linux之间,linux到windows之间实现的并不是那么理想 FTP可以实现linux和wind…

    Linux干货 2016-04-19

评论列表(2条)

  • h
    h 2017-09-13 10:59

    记录内容不错,可以对不记得的内容做一个备注,为了更好的复习。

  • 娅娃爱
    娅娃爱 2017-11-06 13:26

    给一个大的赞,治好了我多年的正则恐惧症!