Linux-正则表达式

RegEx

REGEXP:Regular Expression 由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能

程序支持:grep,sed,awk,vim, less,nginx,varnish等

分两类:

基本正则表达式:BRE

扩展正则表达式:ERE

grep -E, egrep

正则表达式引擎:

采用不同算法,检查处理正则表达式的软件模块

PCRE(Perl Compatible Regular Expressions)

元字符分类:字符匹配、匹配次数、位置锚定、分组

man 7 regex

 

基本正则表达式元字符

字符匹配:

. 匹配任意单个字符

[] 匹配指定范围内的任意单个字符

[^] 匹配指定范围外的任意单个字符

[:alnum:] 字母和数字

[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z

[:lower:] 小写字母 [:upper:] 大写字母

[:blank:] 空白字符(空格和制表符)

[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)

[:cntrl:] 不可打印的控制字符(退格、删除、警铃…)

[:digit:] 十进制数字 [:xdigit:]十六进制数字

[:graph:] 可打印的非空白字符

[:print:] 可打印字符

[:punct:] 标点符号

 

转义\,如.表示任意单个字符,\.则表示.本身

.如果放在[]里边,就表示.本身,不需要转义

 

匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数

* 匹配前面的字符任意次,包括0次

贪婪模式:尽可能长的匹配

.* 任意长度的任意字符

\? 匹配其前面的字符0或1次

\+ 匹配其前面的字符至少1次

\{n\} 匹配前面的字符n次

\{m,n\} 匹配前面的字符至少m次,至多n次

\{,n\} 匹配前面的字符至多n次

\{n,\} 匹配前面的字符至少n次

 

位置锚定:定位出现的位置

^ 行首锚定,用于模式的最左侧

$ 行尾锚定,用于模式的最右侧

^PATTERN$ 用于模式匹配整行

^$ 空行

^[[:space:]]*$ 空白行

\< 或 \b 词首锚定,用于单词模式的左侧

\> 或 \b 词尾锚定;用于单词模式的右侧

\<PATTERN\> 匹配整个单词

 

用grep命令摘出ifconfig ens33命令里的ip地址:

[root@centos7 ~]#ifconfig ens33 | grep -o “[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}” | head -n1

[root@centos7 ~]#ifconfig ens33 | grep -o “inet [0-9.]\+” | cut -d ” ” -f2

……

 

过滤空行

[root@centos7 data]#grep -v “^[[:space:]]*$” f1

 

分组:\(\) 将一个或多个字符捆绑在一起,当作一个整体进行处理,如:\(root\)\+

分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, …

\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

示例: \(string1\+\(string2\)*\)

\1 :string1\+\(string2\)*

\2 :string2

后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身

或者:\|

示例:a\|b: a或b C\|cat: C或cat \(C\|c\)at:Cat或cat

 

查看系统大版本号

[root@centos7 ~]#grep -o “[0-9]\+” /etc/redhat-release | head -n1

[root@centos7 ~]#grep -o ” [0-9]\+” /etc/redhat-release | grep -o “[0-9]\+”

 

windows中的正则表达式:cmd>findstr ?

 

练习

1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)

[root@centos7 ~]#grep -i “^s” /proc/meminfo

[root@centos7 ~]#grep “^[Ss].*” /proc/meminfo

2、显示/etc/passwd文件中不以/bin/bash结尾的行

[root@centos7 ~]#cat /etc/passwd | grep -v “/bin/bash$”

3、显示用户rpc默认的shell程序

[root@centos7 ~]#cat /etc/passwd | grep “^rpc\>” | cut -d: -f7

/sbin/nologin

4、找出/etc/passwd中的两位或三位数

[root@centos7 ~]#cat /etc/passwd | grep -wo “[[:digit:]]\{2,3\}”

5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面有非空白字符的行

[root@centos7 ~]#cat /etc/grub2.cfg | grep “^[[:space:]].*[^[:space:]].*”

6、找出“netstat -tan”命令结果中以LISTEN后跟任意多个空白字符结尾的行

[root@centos7 data]#netstat -tan | grep “LISTEN[[:space:]]*$”

7、显示CentOS7上所有系统用户的用户名和UID

[root@centos7 data]#cat /etc/passwd | cut -d: -f1,3 | grep  “:[1-9][0-9]\{,2\}$”

8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名和shell同名的行

[root@centos7 ~]#cat /etc/passwd | grep “^\(.\+\):.*/\1$”

[root@centos7 ~]#cat /etc/passwd | grep “^\(.*\):.*/\1$”

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

bash:x:1001:1001::/home/bash:/bin/bash

nologin:x:1005:1005::/home/nologin:/sbin/nologin

9、利用df和grep,取出磁盘各分区利用率,并从大到小排序

[root@centos7 ~]#df | grep “/dev/sd” | grep -o “[0-9]*%” | sort -nr

15%

8%

1%

 

egrep及扩展的正则表达式

egrep = grep -E

egrep [OPTIONS] PATTERN [FILE…]

扩展正则表达式的元字符:

字符匹配:

. 任意单个字符

[] 指定范围的字符

[^] 不在指定范围的字符

 

扩展正则表达式

次数匹配:

*:匹配前面字符任意次

?: 0或1次

+:1次或多次

{m}:匹配m次

{m,n}:至少m,至多n次

 

位置锚定:

^ :行首

$ :行尾

\<, \b :语首

\>, \b :语尾

分组:

()

后向引用:\1, \2, …

或者:

a|b: a或b

C|cat: C或cat

(C|c)at:Cat或cat

 

练习

1、显示三个用户root、mage、qjy的UID和默认shell

[root@centos7 ~]#cat /etc/passwd | egrep -w “^(root|mage|qjy)” | cut -d: -f1,3,7

2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行

[root@centos7 ~]#cat /etc/rc.d/init.d/functions | grep “^[[:alpha:]_].*()”

3、使用egrep取出/etc/rc.d/init.d/functions中其基名

[root@centos7 ~]#echo /etc/rc.d/init.d/functions | egrep -o “[^/]*/?$”

4、使用egrep取出上面路径的目录名

echo /etc/rc.d/init.d/functions | egrep -o “.*/[^$]” | egrep -o “.*/”

5、统计last命令中以root登录的每个主机IP地址登录次数

last | egrep root | egrep -wo “[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+” | sort | uniq -c | sort -nr

6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255

[root@centos7 ~]#egrep -w [0-9]

[root@centos7 ~]#egrep -w [1-9][0-9]

[root@centos7 ~]#egrep -w 1[0-9] [0-9]

[root@centos7 ~]#egrep -w 2[0-4][0-9]

[root@centos7 ~]#egrep -w 25[0-5]

7、显示ifconfig命令结果中所有IPv4地址

[root@centos7 ~]#ifconfig | egrep -wo “(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])”

8、将此字符串:welcome to magedu linux 中的每个字符去重并排序,重复次数多的排到前面

[root@centos7 ~]#echo “welcome to magedu linux” | egrep -o [a-z’ ‘] | sort | uniq -c | sort -nr

[root@centos7 ~]#echo “welcome to magedu linux” | egrep -o . | sort | uniq -c | sort -nr

 

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

(1)
上一篇 2018-04-08 20:05
下一篇 2018-04-08 20:14

相关推荐

  • 脚本相关

    变量 echo $name 与 echo “$name” 假如变量是读取文件,前者会自动缩进成一行,后者保留原有格式 (umask=022,mkdir /f1)括号相当于开启一个临时子进程,能读取当前shall的变量等信息,但是进程号不变,命令结束后恢复刚才状态 局部变量,环境变量,只读变量(常量),位置变量,数组 局部变量:只在当前…

    2018-05-14
  • 运维自动化之系统部署

    运维自动化之系统部署 安装程序 CentOS系统安装 系统启动流程: bootloader–>kernel(initramfs)–>rootfs–>/sbin/init   anaconda: 系统安装程序 gui:图形窗口 tui: 基于图形库curses的文本窗口   &nbs…

    Linux笔记 2018-05-27
  • Linux系统目录简介

    帮助理解linux系统目录结构和作用

    2018-04-15
  • 小节

    管道符:cmd1 输出cmd2 输入cmd1 | cmd2如果想将错误信息传给cmd2cmd1 |& cmd2 或 cmd1 2>&1| cmd2加上 >2><&>就是重定向<< key与用户名和组相关的/etc/passwd/etc/shadow 放用户口令的/etc/group/etc/g…

    Linux笔记 2018-04-07
  • linux基础篇

    1、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。
    2、bash的工作特性之命令执行状态返回值和命令行展开所涉及的内容及其示例演示。
    3、请使用命令行展开功能来完成以下练习:
    (1)、创建/tmp目录下的:a_c, a_d, b_c, b_d
    (2)、创建/tmp/mylinux目录下的:
    mylinux/
    ├── bin
    ├── boot
    │ └── grub
    ├── dev
    ├── etc
    │ ├── rc.d
    │ │ └── init.d
    │ └── sysconfig
    │ └── network-scripts
    ├── lib
    │ └── modules
    ├── lib64
    ├── proc
    ├── sbin
    ├── sys
    ├── tmp
    ├── usr
    │ └── local
    │ ├── bin
    │ └── sbin
    └── var
    ├── lock
    ├── log
    └── run

    2018-05-20
  • 喜欢上find

    喜欢上findfind :查找目录下的文件。find 命令其实很好记,会用了,那简直太好玩太方便了-newer查找更改时间比指定文件新的文件-type 按类型查找 (d f l s b c p )D-name 按文件名查找-mtime 按修改时间查找( +2 -2 2)-size 按文件大小查找-perm 按文件权限查找-user 按文件属主来查找-nous…

    2018-04-18