linux 正则表达式


目录

  • 基础正则表达式
  • 扩展正则表达式
  • 练习

字符匹配

  • . 匹配任意单个字符,可以是一个汉字
  • [] 匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
  • [^] 匹配指定范围外的任意单个字符,示例:[^wang]
  • [:alnum:] 字母和数字
  • [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
  • [:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
  • [:upper:] 大写字母
  • [:blank:] 空白字符(空格和制表符)
  • [:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
  • [:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
  • [:digit:] 十进制数字
  • [:xdigit:]十六进制数字
  • [:graph:] 可打印的非空白字符
  • [:print:] 可打印字符
  • [:punct:] 标点符号
  • \w # 匹配单词构成部分,等价于[_[:alnum:]]
  • \W # 匹配非单词构成部分,等价于[^_[:alnum:]]
  • \S # 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
  • \s # 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意Unicode 正则表达式会匹配全角空格符

次数匹配

  • *      # 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
  • .*     # 任意长度的任意字符
  • \?     # 匹配其前面的字符出现0次或1次,即:可有可无
  • \+     # 匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
  • \{n\}   # 匹配前面的字符n次
  • \{m,n\}  # 匹配前面的字符至少m次,至多n次
  • \{,n\}  # 匹配前面的字符至多n次,<=n
  • \{n,\}  # 匹配前面的字符至少n次

位置匹配

  • ^           # 行首锚定, 用于模式的最左侧
  • $           # 行尾锚定,用于模式的最右侧
  • ^PATTERN$     # 用于模式匹配整行
  • ^$          # 空行
  • ^[[:space:]]*$  # 空白行
  • \< 或 \b      # 词首锚定,用于单词模式的左侧
  • \> 或 \b      # 词尾锚定,用于单词模式的右侧
  • \

分组

  • \(string1\(string2\)\)
  • \1 :string1\(string2\)
  • \2 :string2

或者

  • a\|b # a或b
  • C\|cat # C或cat
  • \(C\|c\)at # Cat或cat 

扩展正则表达式

字符匹配

  • . 任意单个字符
  • [wang] 指定范围的字符
  • [^wang] 不在指定范围的字符
  • [:alnum:] 字母和数字
  • [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
  • [:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
  • [:upper:] 大写字母
  • [:blank:] 空白字符(空格和制表符)
  • [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
  • [:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
  • [:digit:] 十进制数字
  • [:xdigit:] 十六进制数字
  • [:graph:] 可打印的非空白字符
  • [:print:] 可打印字符
  • [:punct:] 标点符号

次数匹配

  • * 匹配前面字符任意次
  • ? 0或1次
  • + 1次或多次
  • {n} 匹配n次
  • {m,n} 至少m,至多n次

位置匹配

  • ^ 行首
  • $ 行尾
  • \<, \b 语首
  • \>, \b 语尾

分组与或

  • () 分组
  • | 或者
  • a|b a或b
  • C|cat C或cat
  • (C|c)at Cat或cat

练习

  • 生成30位随机密码 
cat /dev/urandom | tr -dc "[:alnum:]" | head -c 30
  • 查看主机版本号
grep -o "\<[0-9]\+\.[0-9]\>" /etc/redhat-release
  • 查看主机IP地址
ifconfig eth0 | grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" | head -n 1
ifconfig eth0 | egrep -o "\<(([0-9]{1,3}){1,3}\.){3}[0-9]{1,3}" | head -n 1
  • 查看空间使用率最大百分比
df | grep "/dev/sd" | grep -o "[0-9]*%" | grep -o "[0-9]\+" | sort -n | tail -1
df | grep "/dev/sd" | grep -o "\<[0-9]\{1,3\}\>%" | grep -o "[0-9]\+"| sort -n |tail -n -1
  •  查看uid最大的用户名,uid,shell
cat /etc/passwd | sort -t: -k3 -nr | cut -d : -f1,3,7 | head -n 1
  • 查看/tmp的权限,以数字显示
stat -c %a /tmp
stat /tmp|grep "Uid"|grep -o "\<[0-9]\+\>" | head -n 1
stat /tmp|grep "Uid" | cut -d / -f1|cut -d "(" -f2
  •  统计当前连接到本机的每个远程主机的连接数,并按照从大到小排序
ss -nt | tail -n +2 | tr -s " " : | cut -d : -f6 |sort |uniq -c|sort -nr|head -n 1
  • 显示 /etc/init.d/functions 里边所有的方法
grep ".*{$" /etc/init.d/functions | cut -d " " -f1
grep -o ".*()" /etc/init.d/functions
grep -o "^[[:alnum:]_]\+[[:space:]]*()" /etc/init.d/functions
  •  显示/proc/meminfo中以大小写s开头的行
grep -o "^[Ss].*" /proc/meminfo
grep -i "^s.*" /proc/meminfo
  •  显示/etc/passwd文件中不以/bin/bash结尾的行
grep -v "/bin/bash$" /etc/passwd
  •  显示用户rpc默认的shell程序
grep "^rpc\>" /etc/passwd | cut -d : -f7
  •  找出/etc/passwd中的两位数或三位数
grep -o "\<[0-9]\{2,3\}\>" /etc/passwd
  •  显示Centos7的/etc/grub2.cfg文件中,至少以一个空白字符开头且后边存在非空白字符的行
grep "^\s\+[^[:space:]]" /etc/grub2.cfg
  •  找出 "netstat -tan"命令的结果中以 'LISTEN' 后跟任意多个空白字符结尾的行
netstat -tan | grep "LISTEN[[:space:]]*$"
  • 显示Centos7上所有系统用户名和UID
 cut -d: -f1,3 /etc/passwd | grep "\<[[:digit:]]\{,3\}$"
  • 利用df和grep,取出磁盘各分区利用率,并从大到小排序
df |grep "^/dev/sd" |grep -o "[0-9]\{,3\}\%" | grep -o "[0-9]\{,3\}" | sort -nr
  • 显示root、bin、daemon 三个用户的UID和默认shell
grep "^root\|^bin\|^daemon" /etc/passwd | cut -d : -f1,7
  • 找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
grep "^[[:alpha:]_]\+\>()" /etc/rc.d/init.d/functions
  • 使用egrep取出 /etc/rc.d/init.d/functions路径的目录名
echo "/etc/rc.d/init.d/functions" | egrep -o "^/.*/" | egrep  -o  "^/.*[^/]" 
  • 统计last命令中以root登录的每个主机IP地址登录次数
last | grep "^root" | tr -s " " | cut -d " " -f3 | grep -o "\([0-9]\{,3\}\.\)\{3\}[0-9]\{,3\}" | uniq -c | sort -n
 last | grep "^root" | tr -s " " | cut -d " " -f3 | egrep "([0-9]+.){3}[0-9]+" | uniq -c
  • 显示ifconfig命令结果中所有的IPV4地址
ifconfig | egrep -o "([0-9]+\.){3}[0-9]{1,3}"

 ...